bzoj 1783: [Usaco2010 Jan]Taking Turns【贪心+dp】

不知道该叫贪心还是dp
倒着来,记f[0][i],f[1][i]分别为先手和后手从n走到i的最大值。先手显然是取最大的,当后手取到比先手大的时候就交换

#include<iostream>
#include<cstdio>
using namespace std;
const int N=700005;
int n,a[N],w=n;
long long f[2][N],mx;
int read()
{
    int r=0,f=1;
    char p=getchar();
    while(p<'0'||p>'9')
    {
        if(p=='-')
            f=-1;
        p=getchar();
    }
    while(p<='9'&&p>='0')
    {
        r=r*10+p-48;
        p=getchar();
    }
    return r*f;
}
int main()
{
    n=read();
    for(int i=1;i<=n;i++)
        a[i]=read();
    for(int i=n;i>=1;i--)
    {
        f[0][i]=mx,f[1][i]=f[1][w];
        if(f[0][i]<=f[1][w]+a[i])
        {
            f[0][i]=f[1][w]+a[i];
            mx=f[0][i];
            w=i;
            f[1][i]=f[0][i+1];
        }
    }
    printf("%lld %lld\n",f[0][1],f[1][1]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/lokiii/p/9247644.html