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)
