思路见51nodLearning。
代码:
#include <stdio.h>
#include <algorithm>
#include <cstring>
#define FIN freopen("input.txt","r",stdin)
using namespace std;
const int MAX=205;
int N,M;
int a[MAX][MAX],dp[2*MAX][MAX][MAX];
int main(){
//FIN;
while(~scanf("%d%d",&M,&N)){
for(int i=0;i<N;i++){
for(int j=0;j<M;j++){
scanf("%d",&a[i][j]);
}
}
int d;
memset(dp,0,sizeof(dp));
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
for(int k=max(i,j);k<min(i,j)+M;k++){
if(i==j) d=a[i][k-i];
else d=a[i][k-i]+a[j][k-j];
dp[k+1][i][j]=max(dp[k][i][j-1],max(dp[k][i-1][j],max(dp[k][i][j],dp[k][i-1][j-1])))+d;
}
}
}
printf("%d\n",dp[M+N-1][N-1][N-1]);
}
return 0;
}