#include<bits/stdc++.h>
#define ll long long
using namespace std;
int const maxn = 1100;
int const inf = 0x3f3f3f3f;
int head[maxn*maxn],pre[maxn*maxn],flow[maxn*maxn],dep[maxn*maxn],n,m,s,t,p[maxn][maxn],cnt = 1;
int dx[5] = {0,0,0,-1,1},dy[5] = {0,1,-1,0,0};
struct edg{
int v,nxt;
ll w;
}e[maxn*maxn];
bool vis[maxn*maxn];
int id(int x,int y){
return (y-1)*n + x;
}
void add(int u,int v,int w){
e[++cnt].w = w;
e[cnt].v = v;
e[cnt].nxt = head[u];
head[u] = cnt;
}
bool check(int x,int y){
return x>=1&&x<=n&&y>=1&&y<=m;
}
int now[maxn];
bool bfs(){
queue<int> q;
q.push(s);
memset(dep,0,sizeof dep);
dep[s] = 1;
now[s] = head[s];
while(q.size()){
int u = q.front();
q.pop();
for(int i = head[u];i;i = e[i].nxt){
int v = e[i].v;
now[v] = head[v];
if(e[i].w&&dep[v]==0){
dep[v] = dep[u] + 1;
q.push(v);
if(v==t)return 1;
}
}
}
return 0;
}
ll dfs(int u,ll flow){
ll sum = 0;
if(u==t)return flow;
for(int i = now[u];i&&flow;i = e[i].nxt){
int v = e[i].v;
now[u] = i;
if(e[i].w&&dep[v]==dep[u] + 1){
ll k = dfs(v,min(flow,e[i].w));
if(k==0)dep[v]==0;
e[i].w -= k;
e[i^1].w += k;
sum += k;
flow-=k;
}
}
return sum;
}
int main(){
cin >> m >> n;
s = 0,t = m*n+m+n;
ll sum = 0;
for(int i = 1;i <= m;i ++){
for(int j = 1;j <= n;j ++){
cin >> p[i][j];
sum += p[i][j];
}
}
for(int i = 1;i <= m;i ++){
for(int j = 1;j <= n;j ++){
if(id(j,i)%2==0){
add(id(j,i),t,p[i][j]);
add(t,id(j,i),0);
continue;
}
add(s,id(j,i),p[i][j]);
add(id(j,i),s,0);
for(int k = 1;k <= 4;k ++){
int x = j + dx[k],y = i + dy[k];
if(check(x,y)){
add(id(j,i),id(x,y),inf);
add(id(x,y),id(j,i),0);
}
}
}
}
ll maxflow = 0;
while(bfs()){
maxflow += dfs(s,inf);
}
cout << sum -maxflow;
return 0;
}