//思路,搜索每一列从一处到另一处的路径长
//即所包含的所有之和
//样例12213
//动态数组,否则会M
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1e3 + 10;
ll a[MAXN][MAXN];
ll b[MAXN][MAXN];
ll c[MAXN];
//来自上
ll d[MAXN];
//来自下
ll m,n;
int main(){
scanf("%d%d",&n,&m);
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
scanf("%d",&a[i][j]);
b[i][j] = -1e17;
}
}
//memset(b,0xc0,sizeof(b));
//printf("%d",b[0][0]);
b[0][1] = 0;
for(int i = 1;i<=n;i++){
b[i][1] = a[i][1] + b[i-1][1];
//printf("%d ",b[i][1]);
}
for(int i = 2;i<=m;i++){
c[0] = 0;
for(int j = 1;j<=n;j++){
c[j] = max(b[j][i-1],c[j-1]) + a[j][i];
}
memset(d,0xc0,sizeof(d));
d[n+1] = 0;
for(int j = n;j>=1;j--){
d[j] = max(b[j][i-1],d[j+1]) + a[j][i];
}
for(int j = 1;j<=n;j++){
b[j][i] = max(c[j],d[j]);
printf("b[%d][%d]=%d=max(%d,%d)\n",j,i,b[j][i],c[j],d[j]);
}
}
/*for(int i = 2;i<=m;i++){
for(int j = 1;j<=n;j++){
printf("%d ",b[j][i]);
}
printf("\n");
}*/
printf("%d",b[n][m]);
return 0;
}
样例2不过,60分,输出-5>-2 怎么办