HDU 2845 Beans

这题属于最大不连续字段和。

因为它是二维的所以把第i行做一次线性dp,压成dp[i]来储存,再在dp数组中做一次最大不连续字段和求答案就好啦,一道二维的题目,秒变一维的。

状态表示:dp[i]代表第i行在做最大不连续字段和的最终值。

转移方程:当i大于2——如果dp[i]从它的前一位转移而来那么它的值便是dp[i-1],如果dp[i]从第i-2位转移而来它的值便是dp[i-2]+dp[i],在二者中取最大值(满足最优子结构):dp[i]=max(dp[i-1],dp[i-2]+dp[i]);

#include<bits/stdc++.h>
using namespace std;
const int N=200000+5;
int n,m,a[N],dp[N];
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
                scanf("%d",&a[j]);
            for(int j=2;j<=m;j++)
                a[j]=max(a[j-2]+a[j],a[j-1]);
            dp[i]=a[m];
        }
        for(int i=2;i<=n;i++)
            dp[i]=max(dp[i-2]+dp[i],dp[i-1]);
        printf("%d\n",dp[n]);
    }
    return 0;
}
知识兔
计算机