#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int n,m,x,y,dis[N],now[N],inf=1e18,ans,head[N],tot=1,s,t,sum,zh;
int dw[N],cz[N],a;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
struct Edge
{
int v,next,val;
}e[N];
int bh(int i,int j)
{
return (i-1)*m+j;
}
void add(int x,int y,int z)
{
e[++tot].v=y;
e[tot].next=head[x];
head[x]=tot;
e[tot].val=z;
}
bool bfs()
{
for(int i=s;i<=t;i++) dis[i]=inf;
queue<int> q;
q.push(s);
dis[s]=0;
now[s]=head[s];
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x];i;i=e[i].next)
{
int to=e[i].v;
if(e[i].val>0&&dis[to]==inf)
{
q.push(to);
now[to]=head[to];
dis[to]=dis[x]+1;
if(to==t) return true;
}
}
}
return false;
}
int dfs(int x,int sum)
{
int k,res=0;
if(x==t) return sum;
for(int i=now[x];i&∑i=e[i].next)
{
now[x]=i;
int to=e[i].v;
if(e[i].val>0&&dis[to]==dis[x]+1)
{
k=dfs(to,min(sum,e[i].val));
if(k==0) dis[to]=inf;
e[i].val-=k;
e[i^1].val+=k;
res+=k;
sum-=k;
}
}
return res;
}
signed main()
{
scanf("%lld%lld",&m,&n);
s=0,t=n*m+1;
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
scanf("%lld",&a);
zh+=a;
if((i+j)%2==0)
{
add(s,bh(i,j),a);
add(bh(i,j),s,0);
for(int k=0;k<=3;k++)
{
int rx=i+dx[k],ry=j+dy[k];
if(rx>=1&&rx<=m&&ry>=1&&ry<=n)
{
add(bh(i,j),bh(rx,ry),inf);
add(bh(rx,ry),bh(i,j),0);
}
}
}
else
{
add(bh(i,j),t,a);
add(t,bh(i,j),0);
}
}
}
while(bfs()) ans+=dfs(s,inf);
printf("%lld",zh-ans);
return 0;
}