BZOJ 1783 [Usaco2010 Jan]Taking Turns

BZOJ_1783

    乍看上去大概就要dp的,细想一下确实dp是可行的,不过中文描述里面漏了句关键的话,一开始让我迷茫了一阵,后来仔细看了英文描述之后才算清楚了。

    另外突发奇想用英文写了题解,大概脑子在深夜的时候总会有点诡异的想法吧……(本人六级尚未考过,如果英文太烂的话还望谅解……)

/*
    f[i] means the maximum weights we can get between hay bale i and hay bale N (include i and N).
    id[i] means which one we should choose firstly if we want to get f[i] weights between hay bale i and hay bale N (include i and N).

    We may choose the best choice in (1) and (2).
    (1) donot choose hay bale i : f[i] = f[i + 1], id[i] = id[i + 1];
    (2) choose hay bale i : f[i] = w[i] + f[id[i + 1] + 1], id[i] = i. (w[i] means the weight of hay bale i)

    note: We should make f[N] = w[N], f[N + 1] = 0, id[N] = N initially.
*/

#include<stdio.h>
#include<string.h>
#define MAXD 700010
typedef long long LL;
LL f[MAXD];
int N, id[MAXD], w[MAXD];
int main()
{
    while(scanf("%d", &N) == 1)
    {
        for(int i = 1; i <= N; i ++) scanf("%d", &w[i]);
        f[N] = w[N], f[N + 1] = 0, id[N] = N;
        for(int i = N - 1; i >= 1; i --)
        {
            f[i] = f[i + 1], id[i] = id[i + 1];
            LL t = w[i] + f[id[i + 1] + 1];
            if(t >= f[i]) f[i] = t, id[i] = i;
        }
        printf("%lld %lld\n", f[1], f[id[1] + 1]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/staginner/p/2740501.html