http://acm.hdu.edu.cn/showproblem.php?pid=2845
还是没忍住看了别人的解题报告......
2次DP:第一次求出每行能得到的最大值,第二次求出总的最大值。
dp[i][0]表示第i个不取能得到的最大值,dp[i][1]表示第i个取能得到的最大值。
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn =200000+5;
int dp[maxn][2],row[maxn];
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
for(int i=1;i<=m;i++){
dp[0][0]=0,dp[0][1]=0;
for(int j=1;j<=n;j++){
int val;
scanf("%d",&val);
dp[j][0]=max(dp[j-1][0],dp[j-1][1]);
dp[j][1]=dp[j-1][0]+val;
}
row[i]=max(dp[n][0],dp[n][1]);///每行能得到的最大值
}
for(int i=1;i<=m;i++){
dp[i][0]=max(dp[i-1][0],dp[i-1][1]);
dp[i][1]=dp[i-1][0]+row[i];
}
printf("%d\n",max(dp[m][1],dp[m][0]));
}
return 0;
}