#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[55][55];
int dp[110][55][55];
int main(){
scanf("%d%d",&n,&m);
int q,p,t;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a[i][j]);
}
}
dp[1][1][1]=a[1][1];
for(int i=2;i<=m;i++){
for(int x=1;x<=min(i,min(n,m));x++){
int q=x,p=i-x+1;
for(int y=1;y<=min(i,min(n,m));y++){
if(x==y){
continue;
}else{
int q2=y,p2=i-y+1;
dp[i][x][y]=max(max(dp[i-1][x-1][y-1],dp[i-1][x-1][y]),max(dp[i-1][x][y-1],dp[i-1][x][y]))+a[q][p]+a[q2][p2];
}
}
}
}
for(int i=m+1;i<=n+m-1;i++){
for(int x=1;x<=min(n-i+m,m);x++){
int q=i-n+x,p=n-x+1;
for(int y=1;y<=min(n-i+m,m);y++){
if(x==y){
if(i==n+m-1) dp[i][x][y]=max(max(dp[i-1][x+1][y+1],dp[i-1][x+1][y]),max(dp[i-1][x][y+1],dp[i-1][x][y]))+a[q][p];
continue;
}else{
int q2=i-n+y,p2=n-y+1;
dp[i][x][y]=max(max(dp[i-1][x+1][y+1],dp[i-1][x+1][y]),max(dp[i-1][x][y+1],dp[i-1][x][y]))+a[q][p]+a[q2][p2];
}
}
}
}
printf("%d\n",dp[n+m-1][1][1]);
return 0;
}
错误网址