#include<stdio.h>
#include<stdlib.h>
int a[51][51][51][51]={0};
int work(int r,int s,int t,int m)
{
if(r>=s&&r>=t&&r>=m)return r;
if(s>=r&&s>=t&&s>=m)return s;
if(t>=r&&t>=s&&t>=m)return t;
if(m>=r&&m>=s&&m>=t)return m;
}
int main()
{
int i,j,n,m,k;
int b[51][51]={0};
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&b[i][j]);
}
}
for(i=3;i<m+n;i++)//起始点为1,1第一步后横纵坐标和为3,如(1,2)(2,1)
{
for(j=1;j<i;j++)
{
for(k=1;k<j;k++)//k<j判重
{
if((i-k-1!=i-j)&&(j-1!=k))
a[j][i-j][k][i-k]=work(a[j-1][i-j][k-1][i-k],a[j-1][i-j][k][i-k-1],a[j][i-j-1][k-1][i-k],a[j][i-j-1][k][i-k-1])+b[j][i-j]+b[k][i-k];
else
a[j][i-j][k][i-k]=work(a[j-1][i-j][k-1][i-k],-1,a[j][i-j-1][k-1][i-k],a[j][i-j-1][k][i-k-1])+b[j][i-j]+b[k][i-k];
}
}
}
printf("%d",a[n][m-1][n-1][m]);
system("pause");
return 0;
}
#include<stdio.h>
#include<stdlib.h>
int a[51][51][51][51]={0};
int work(int r,int s,int t,int m)
{
if(r>=s&&r>=t&&r>=m)return r;
if(s>=r&&s>=t&&s>=m)return s;
if(t>=r&&t>=s&&t>=m)return t;
if(m>=r&&m>=s&&m>=t)return m;
}
int main()
{
int i,j,n,m,k;
int b[51][51]={0};
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
scanf("%d",&b[i][j]);
}
}
for(i=3;i<m+n;i++)//起始点为1,1第一步后横纵坐标和为3,如(1,2)(2,1)
{
for(j=1;j<i;j++)
{
for(k=1;k<j;k++)//k<j判重
{
if((i-k-1!=i-j)&&(j-1!=k))
a[j][i-j][k][i-k]=work(a[j-1][i-j][k-1][i-k],a[j-1][i-j][k][i-k-1],a[j][i-j-1][k-1][i-k],a[j][i-j-1][k][i-k-1])+b[j][i-j]+b[k][i-k];
else
a[j][i-j][k][i-k]=work(a[j-1][i-j][k-1][i-k],-1,a[j][i-j-1][k-1][i-k],a[j][i-j-1][k][i-k-1])+b[j][i-j]+b[k][i-k];
}
}
}
printf("%d",a[n][m-1][n-1][m]);
system("pause");
return 0;
}