同方格取数,三维dp,注意一下边界就好了。详见方格取数博文。
#include <bits/stdc++.h>
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline int min(int x,int y){return x<y?x:y;}
inline int max(int x,int y){return x>y?x:y;}
#define N 52
int f[N<<1][N][N],n,m,a[N][N];
int main(){
// freopen("a.in","r",stdin);
m=read();n=read();m--;n--;
for(int i=0;i<=m;++i)
for(int j=0;j<=n;++j) a[i][j]=read();
memset(f,128,sizeof(f));f[0][0][0]=0;
for(int i=1;i<=n+m;++i)
for(int j=0;j<=m&&j<=i;++j)
for(int k=0;k<=m&&k<=i;++k){
f[i][j][k]=max(max(f[i-1][j][k],f[i-1][j][k-1>0?k-1:0]),max(f[i-1][j-1>0?j-1:0][k],f[i-1][j-1>0?j-1:0][k-1>0?k-1:0]));
f[i][j][k]+=a[j][i-j];
if(j!=k) f[i][j][k]+=a[k][i-k];
}
printf("%d\n",f[n+m][m][m]);
return 0;
}