#include<stdio.h>
#include<string.h>
#define condition(con,tr,fa) ((con)?(tr):(fa))
#define max(a,b) condition(a>b,a,b)
#define min(a,b) condition(a<b,a,b)
#define reset(arr) memset(arr,0,sizeof(arr))
#define MAXN 51
int map[MAXN][MAXN];
int ans[MAXN+MAXN][MAXN][MAXN];
int ansflag[MAXN+MAXN][MAXN][MAXN];
int m,n;
int ansf(int step,int x1,int x2){
//printf(“\nCall:step=%d,x1=%d,x2=%d;\n”,step,x1,x2);
if(step==0)return map[0][0];
if(ansflag[step][x1][x2]>0){
return ans[step][x1][x2];
}
int y1=step-x1;
int y2=step-x2;
int temp=0;
if(x1>0 && x2>0 && x1-1!=x2-1) temp=max(temp,ansf(step-1,x1-1,x2-1));
if(x1>0 && y2>0 && x1-1!=x2) temp=max(temp,ansf(step-1,x1-1,x2));
if(y1>0 && x2>0 && x1!=x2-1) temp=max(temp,ansf(step-1,x1,x2-1));
if(y1>0 && y2>0 && x1!=x2) temp=max(temp,ansf(step-1,x1,x2));
//printf(“\nPoint 1:step=%d,x1=%d,x2=%d;temp=%d;map1=%d,map2=%d;\n”,step,x1,x2,temp,map[x1][y1],map[x2][y2]);
ans[step][x1][x2]=temp+map[y1][x1]+map[y2][x2];//*condition(x1==x2,0,1);
ansflag[step][x1][x2]=1;
//printf(“\nAfter calculating:step=%d,x1=%d,x2=%d;Value=%d;\n”,step,x1,x2,ans[step][x1][x2]);
return ans[step][x1][x2];
}
int main(){
reset(map);
reset(ans);
reset(ansflag);
scanf(“%d%d”,&m,&n);
int x,y,val=1;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf(“%d”,&map[i][j]);
/*
printf(“\n”);
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
printf(“%d ”,map[i][j]);
}
printf(“\n”);
}printf(“\n”);
*/
printf(“%d”,ansf(m+n-2,n-1,n-1));
/*
for(int step=0;step<m+n-1;step++){
printf(“\n—–\nStep=%d:\n”,step);
for(int x1=0;x1<n;x1++){
printf(“\n”);
for(int x2=0;x2<n;x2++){
printf(“%d ”,ans[step][x1][x2]);
}
}
}
*/
/*
while(true){
printf(“\n————–\n”);
char c;
scanf(“%c”,&c);
if(c=='a'){
int step,x1,x2;
scanf(“%d%d%d”,&step,&x1,&x2);
//printf(“%d\n”,ansf(step,x1,x2));
printf(“%d\n”,ans[step][x1][x2]);
printf(“\n————–\n”);
}
else if(c=='m'){
int x,y;
scanf(“%d%d”,&x,&y);
printf(“%d\n”,map[x][y]);
printf(“\n————–\n”);
}
}*/
}