先求每行的最大和 然后再对所有行dp
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
int dp[200010][2];
int row[200010];
int main(){
int N, M;
while( scanf( "%d%d", &N, &M ) != EOF ){
memset( dp, 0, sizeof( dp ) );
memset( row, 0, sizeof( row ) );
for( int i = 1; i <= N; i++ ){
for( int j = 1; j <= M; j++ ){
int temp;
cin >> temp;
dp[j][0] = max( dp[j-1][0], dp[j-1][1] );
dp[j][1] = dp[j-1][0] + temp;
}
row[i] = max( dp[M][0], dp[M][1] );
}
for( int i = 1; i <= N; i++ ){
dp[i][0] = max( dp[i-1][0], dp[i-1][1] );
dp[i][1] = dp[i-1][0] + row[i];
}
cout << max( dp[N][1], dp[N][0] ) << endl;
}
return 0;
}