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 LuaJIT (2.0.4) (judge verdict: Accepted)

local mma, mmi = math.max, math.min
local h, w = io.read("*n", "*n", "*l")
local map = {}
for j = 1, w do map[j] = {} end
for i = 1, h do
  local str = io.read()
  for j = 1, w do
    map[j][i] = str:sub(j, j):byte()
  end
end
local function solve(col)
  local mapl, mapr = map[col], map[col + 1]
  local cost = {}
  do
    cost[1] = {}
    local lv = mapl[1]
    for right = 1, h do
      local z = lv == mapr[right] and 1 or 0
      cost[1][right] = z
    end
  end
  for left = 2, h do
    cost[left] = {}
    local lv = mapl[left]
    do
      local z = lv == mapr[1] and 1 or 0
      cost[left][1] = z
    end
    for right = 2, h do
      local z = lv == mapr[right] and 1 or 0
      z = z + cost[left - 1][right - 1]
      cost[left][right] = z
    end
  end
  for sum = h * 2 - 1, 2, -1 do
    local dst_l_min, dst_l_max = mma(1, sum - h), mmi(h, sum - 1)
    for dst_l = dst_l_min, dst_l_max do
      local dst_r = sum - dst_l
      if dst_l == h then
        cost[h][dst_r] = cost[h][dst_r] + cost[h][dst_r + 1]
      elseif dst_r == h then
        cost[dst_l][h] = cost[dst_l][h] + cost[dst_l + 1][h]
      else
        cost[dst_l][dst_r] = cost[dst_l][dst_r] + mmi(cost[dst_l + 1][dst_r], cost[dst_l][dst_r + 1])
      end
    end
  end
  local res = cost[1][1]
  for i = 1, h do
    res = mmi(res, cost[i][1])
    res = mmi(res, cost[1][i])
  end
  return res
end

local ret = 0
for i = 1, w - 1 do
  ret = ret + solve(i)
end
print(ret)