#include<bits/stdc++.h>
namespace IO{
static const int buf_size=1000000;
static unsigned char buf[buf_size];
static int buf_len,buf_pos;
bool isEOF(){
if(buf_pos==buf_len){
buf_pos=0;
buf_len=fread(buf,1,buf_size,stdin);
if(buf_pos==buf_len)return 1;
}
return 0;
}
char gc(){
return isEOF()?EOF:buf[buf_pos++];
}
int rint(){
int x=0;char c=gc();
for(;c<48||c>57;c=gc());
for(;c>=48&&c<=57;c=gc())
x=(x<<1)+(x<<3)+(c^48);
return x;
}
template<typename T>
void read(T&x){x=rint();}
template<typename T,typename...S>
void read(T&x,S&...rest){read(x);read(rest...);}
}
using IO::read;
using namespace std;
const int N=1e4+1,M=2e5+1;
int n,m,s,t,a[101][101],dis[N],q[N*5],sum;
int tot=1,head[N],to[M],cap[M],nxt[M],cur[N];
bool vis[N];
void add(int u,int v,int w){
nxt[++tot]=head[u];head[u]=tot;to[tot]=v;cap[tot]=w;
nxt[++tot]=head[v];head[v]=tot;to[tot]=u;cap[tot]=0;
}
bool bfs(){
for(int i=1;i<=n;++i)dis[i]=-1,cur[i]=head[i];
int l=0,r=1;
q[1]=s;dis[s]=0;
for(;l<r;){
int x=q[++l];
for(int i=head[x];i;i=nxt[i]){
if(cap[i]&&dis[to[i]]==-1){
dis[to[i]]=dis[x]+1;
if(to[i]==t)return 1;
q[++r]=to[i];
}
}
}
return 0;
}
int dfs(int x,int f){
if(x==t)return f;
int used=0,d;
for(int&i=cur[x];i;i=nxt[i])
if(cap[i]&&dis[to[i]]==dis[x]+1){
d=dfs(to[i],min(f,cap[i]));
cap[i]-=d;cap[i^1]+=d;
used+=d;f-=d;
if(!f)return used;
}
if(!used)dis[x]=-1;
return used;
}
int dinic(){
int res=0;
for(;bfs();)res+=dfs(s,2e9);
return res;
}
int main(){
read(n,m);
s=n*m+1;t=s+1;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
read(a[i][j]);
sum+=a[i][j];
if((i+j)&1){
add(s,m*(i-1)+j,a[i][j]);
if(i>1)add(m*(i-1)+j,m*(i-2)+j,2e9);
if(j>1)add(m*(i-1)+j,m*(i-1)+j-1,2e9);
if(i<n)add(m*(i-1)+j,m*i+j,2e9);
if(j<m)add(m*(i-1)+j,m*(i-1)+j+1,2e9);
}
else{
add(m*(i-1)+j,t,a[i][j]);
}
}
}
printf("%d\n",sum-dinic());
return 0;
}