#include <bits/stdc++.h>
using namespace std;
const int dx[] = {0, 1, -1, 0, 0};
const int dy[] = {0, 0, 0, 1, -1};
struct MinCostMaxFlow {
  int head[20010], total;
  int next[1000010], aim[1000010], flow[1000010], cost[1000010];
  int f[20010], from[20010], p[20010];
  bool v[20010];
  MinCostMaxFlow() : total(1) {}
  void Add(int x, int y, int f, int c) {
    next[++total] = head[x];
    aim[total] = y;
    flow[total] = f;
    cost[total] = c;
    head[x] = total;
  }
  void Insert(int x, int y, int f, int c) {
    Add(x, y, f, c);
    Add(y, x, 0, -c);
  }
  bool SPFA() {
    static queue<int> q;
    while (!q.empty()) q.pop();
    memset(f, 0x3f, sizeof(f));
    memset(v, false, sizeof(v));
    f[0] = 0;
    q.push(0);
    while (!q.empty()) {
      int x = q.front();
      q.pop();
      v[x] = false;
      for (int i = head[x]; i; i = next[i])
        if (flow[i] && f[aim[i]] > f[x] + cost[i]) {
          f[aim[i]] = f[x] + cost[i];
          if (!v[aim[i]]) v[aim[i]] = true, q.push(aim[i]);
          from[aim[i]] = x;
          p[aim[i]] = i;
        }
    }
    return f[(20010 - 1)] != 0x3f3f3f3f;
  }
  int EdmondsKarp() {
    int re = 0;
    while (SPFA()) {
      int max_flow = 0x3f3f3f3f;
      for (int i = (20010 - 1); i != 0; i = from[i])
        max_flow = ((max_flow) < (flow[p[i]]) ? (max_flow) : (flow[p[i]]));
      for (int i = (20010 - 1); i != 0; i = from[i]) {
        flow[p[i]] -= max_flow;
        flow[p[i] ^ 1] += max_flow;
      }
      re += f[(20010 - 1)] * max_flow;
    }
    return re;
  }
} solver;
int m, n;
int src[110][110];
int main() {
  cin >> m >> n;
  for (int i = 1; i <= m; ++i)
    for (int j = 1; j <= n; ++j) scanf("%d", &src[i][j]);
  for (int i = 1; i <= m; ++i)
    for (int j = 1; j <= n; ++j) {
      if (i + j & 1) {
        solver.Insert(0, ((i - 1) * n + j), 1, 0);
        for (int k = 1; k <= 4; ++k) {
          int fx = i + dx[k], fy = j + dy[k];
          if (!fx || !fy || fx > m || fy > n) continue;
          solver.Insert(((i - 1) * n + j), ((fx - 1) * n + fy), 1,
                        src[i][j] != src[fx][fy]);
        }
      } else
        solver.Insert(((i - 1) * n + j), (20010 - 1), 1, 0);
    }
  cout << solver.EdmondsKarp() << endl;
  return 0;
}
