HDU 2845 Beans

DP。

先dp处理出每一行能得到的最大价值,再dp选择哪几行获得最大价值。

行列选择的本质是一样的操作。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;

const int maxn=200000+10;
int n,m;
long long a[maxn],f[maxn],dp[maxn][2];
long long b[maxn];

long long work(int len)
{
    long long res=0;
    dp[0][0]=dp[0][1]=0;
    for(int i=1;i<=len;i++)
    {
        dp[i][0]=max(dp[i-1][1],dp[i-1][0]);
        dp[i][1]=dp[i-1][0]+b[i];
        res=max(res,max(dp[i][0],dp[i][1]));
    }
    return res;
}

int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        for(int i=1; i<=n*m; i++) scanf("%lld",&a[i]);
        int cnt=0,hang=1;
        for(int i=1;i<=n*m;i++)
        {
            b[++cnt]=a[i];
            if(cnt==m)
            {
                f[hang++]=work(m);
                cnt=0;
            }
        }
        for(int i=1;i<=n;i++) b[i]=f[i];
        printf("%lld
",work(n));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/zufezzt/p/5448632.html