#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n , m , Map[1005][1005] ;
int f[1005][1005][2] ;
int sum[1005][1005] , dis[1005][1005] ;
int main()
{
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
memset(f,0xc0,sizeof(f)) ;
cin >> n >> m ;
for ( int i = 1 ; i <= n ; i++) {
for(int j = 1 ; j <= m ; j ++) {
cin >> Map[i][j] ;
}
}
for ( int i = 1 ; i <= n ; i ++ ) {
for ( int j = 1 ; j <= m ; j ++ ) {
sum[i][j] = sum[i][j-1] + Map[i][j] ;
}
for ( int j = m ; j >= 1 ; j -- ) {
dis[i][j] = dis[i][j+1] + Map[i][j] ;
}
}
f[1][1][1] = Map[1][1] ;
f[1][1][0] = Map[1][1] ;
for ( int i = 2 ; i <= m ; i ++) {
f[1][i][1] = f[1][i][0] = f[1][i-1][1]+Map[1][i] ;
}
for ( int i = 2 ; i <= n + 1 ; i ++ ) {
for ( int j = 1 ; j <= m ; j ++ ) {
for ( int k = 1 ; k < j ; k ++ ) {
f[i][j][1] = max ( sum[i-1][j]-sum[i-1][k-1] + max(f[i-1][k][0],f[i-1][k][1]) , f[i][j][1] );
}
for ( int k = j + 1 ; k <= m ; k ++ )
{
f[i][j][0] = max ( dis[i-1][k]-dis[i-1][j-1]+max(f[i-1][k][1],f[i-1][k][0]),f[i][j][0]);
}
}
}
cout << max(f[n+1][m][1],f[n+1][m][0]) ;
return 0;
}
样例过了,0分,许多hack数据也没过,求原因