Problem:
Score : 800 points

Problem Statement

Mr. Takahashi has in his room an art object with H rows and W columns, made up of H \times W blocks.
Each block has a color represented by a lowercase English letter (a-z).
The color of the block at the i-th row and j-th column is c_{i,j}.

Mr. Takahashi would like to dismantle the object, finding it a bit kitschy for his tastes.
The dismantling is processed by repeating the following operation:

Choose one of the W columns and push down that column one row.
The block at the bottom of that column disappears.

Each time the operation is performed, a cost is incurred.
Since blocks of the same color have a property to draw each other together, the cost of the operation is the number of the pairs of blocks (p, q) such that:

The block p is in the selected column.

The two blocks p and q are horizontally adjacent (before pushing down the column).

The two blocks p and q have the same color.

Mr. Takahashi dismantles the object by repeating the operation H \times W times to get rid of all the blocks.
Compute the minimum total cost to dismantle the object.

Constraints

1 ≤ H ≤ 300

2 ≤ W ≤ 300

All characters c_{i,j} are lowercase English letters (a-z).

Partial Score

In test cases worth 300 points, W = 3.

Input

The input is given from Standard Input in the following format:

H W
c_{1,1}c_{1,2}..c_{1,W}
c_{2,1}c_{2,2}..c_{2,W}
:
c_{H,1}c_{H,2}..c_{H,W}

Output

Print the minimum total cost to dismantle the object.

Sample Input 1

2 3
rrr
brg

Sample Output 1

2

For example, the total cost of 2 can be achieved by performing the operation as follows and this is the minimum value.

Sample Input 2

6 3
xya
xya
ayz
ayz
xaz
xaz

Sample Output 2

0

The total cost of 0 can be achieved by first pushing down all blocks of the middle column, then all of the left column, and all of the right column.

Sample Input 3

4 2
ay
xa
xy
ay

Sample Output 3

0

The total cost of 0 can be achieved by the following operations:

pushing down the right column one row;

pushing down the left column one row;

pushing down all of the right column;

and pushing down all of the left column.

Sample Input 4

5 5
aaaaa
abbba
ababa
abbba
aaaaa

Sample Output 4

24

Sample Input 5

7 10
xxxxxxxxxx
ccccxxffff
cxxcxxfxxx
cxxxxxffff
cxxcxxfxxx
ccccxxfxxx
xxxxxxxxxx

Sample Output 5

130

Solution in C++14 (GCC 5.4.1) (judge verdict: Time Limit Exceeded)

#include <algorithm>
#include <cstdio>
#include <cmath>
#include <iostream>
#include <queue>
#include <string>
#include <set>
#include <vector>

using namespace std;
typedef long long ll;

#define MAX_H (302)
#define MAX_W (302)
int dp[MAX_W][MAX_H];
int H;
int W;
char C[MAX_W][MAX_H];
int memo[MAX_H+1][MAX_H+1];
ll calc2(int l, int r) {
    if ( l == H || r == H ) return 0;
    else if ( memo[l][r] != -1 ) {
	return memo[l][r];
    }
    else {
	
	ll ret = dp[l][r];
	ll cand1 = calc2(l + 1, r);
	ll cand2 = calc2(l, r + 1);
	return memo[l][r] = ret + min(cand1, cand2);
    }
}

ll calc(int l) {
    for ( int i = 0; i < H; i++ ) {
	for ( int j = 0; j < H; j++ ) {
	    int num = H - max(i, j);
	    int head_l = (i < j) ? j-i : 0;
	    int head_r = (j < i) ? i-j : 0;
	    int count = 0;
	    for ( int k = 0; k < num; k++ ) {
		if ( C[l][head_l + k] == C[l+1][head_r + k] ) {
		    count++;
		}
	    }
	    dp[i][j] = count;
	    memo[i][j] = -1;
	}
    }

    return calc2(0, 0);
}

int main()
{
    scanf("%d %d", &H, &W);
    for ( int i = 0; i < H; i++ ) {
	for ( int j = 0; j < W; j++ ) {
	    scanf(" %c ", &C[j][i]);
	}
    }

    ll ans = 0;
    for ( int i = 0; i < W-1; i++ ) {
	ll add = calc(i);
	ans += add;
    }

    printf("%lld\n", ans);
    
    return 0;
}