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
",f[0][1],f[1][1]);
	return 0;
}
原文地址:https://www.cnblogs.com/lokiii/p/9247644.html