#include<bits/stdc++.h>
using namespace std;
int n,m,a[1005][1005],u,up[1005],down[1005],f[1005];
int main(){
for(int i=1;i<=1004;i++)memset(a[i],-10005,sizeof(a[i]));
scanf("%d%d",&n,&m);
//a[n+1][m]=0;
//a[n][m+1]=0;
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&a[i][j]);
// for(int i=n;i>=1;i--)for(int j=m;j>=1;j--){
// a[i][j]+=max(max(a[i+1][j],a[i][j+1]),max(a[i-1][j],a[i][j-1]));
// }
//printf("\n\n");
f[1]=a[1][1];
for(int i=2;i<=n;i++) f[i]=f[i-1]+a[i][1];
for(int i=2;i<m;i++){
memset(up,0,sizeof(up));
memset(down,0,sizeof(down));
down[1]=f[1]+a[1][i];
up[n]=f[n]+a[n][i];
//for(int j=1;j<=m;j++){
for(int j=2;j<=n;j++)down[j]=max(f[j],down[j-1])+a[j][i];
for(int j=n-1;j>=1;j--)up[j]=max(f[j],up[j+1])+a[j][i];
for(int j=1;j<=n;j++)f[j]=max(up[j],down[j]);
//}
}
//for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++)printf("%d ",a[i][j]);
// printf("\n");
//}
f[1]+=a[1][m];
for(int i=2;i<=n;i++) f[i]=max(f[i],f[i-1])+a[i][m];
printf("%d",f[n]);
return 0;
}
自认为写的很完美,但为什么18和20数据点过不了,求助dalao!!!