#include<bits/stdc++.h>//万能头
using namespace std;
const int N=100;
int f[N][N][N];//存储坐标
int w[N][N];//存储好心度
int m,n;//与题意同
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>w[i][j];
}
}//输入
for(int k=2;k<=n+m;k++){//k表示横纵坐标之和,优化,将四维数组优化为三维
for(int i1=1;i1<=m;i1++){//第一条路径坐标,即小渊给小轩
for(int i2=1;i2<=m;i2++){//第二条路径坐标,即小轩给小渊
int j1=k-i1;
int j2=k-i2;//第一条路径坐标(i1,j1),第二条路径坐标(i2,j2)
if(j1>=1&&j1<=n&&j2>=1&&j2<=n){
int t=w[i1][j1];//t表示该点好心度
if(i1!=i2){
t+=w[i2][j2];//如果不在同一点就加上两个点的好心度
}
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2-1]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1-1][i2]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2-1]+t);
f[k][i1][i2]=max(f[k][i1][i2],f[k-1][i1][i2]+t);//dp
}
}
}
}
cout<<f[m+n][m][m];//输出
return 0;
}
第二个和第十个样例点RE 必将感激不尽