CF859C Pie Rules(伪博弈+dp)

题目连接:跳转到网站

题目大意:有 n 个物品,每个物品有不同的价值,物品按顺序分给两个人,有一块令牌,每回合拥有令牌的人拥有物品的分配权,但是该回合未获得物品的那个人会在下回合获得令牌,开始令牌在Bob手里,两个人都采取最优的策略,问最后各能获得的最大价值是多少。

解题思路:因为数据范围给的n<=50,(要是给1e3的话 就比较好看出是个dp了)就是开一个dp[i]记录到第i个为止,当前持有令牌的人所得到的最大权值,从n逆序遍历(因为我们只知道初始时Bob拿着令牌,所以我们可以倒着转移状态 ,Bob: dp[1] , Alice: sum[1]-dp[1]):

如果当前持有令牌的人不要这个物品,那么dp[i]=dp[i+1] (权值不增加)
要的话:dp[i]=sum[i+1]+w[i]-dp[i+1] (后缀和减去上一个人的权值)

Code:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=200007;

int w[55],sum[55],dp[55]; 

int main(){
	
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&w[i]);
	
	for(int i=n;i>=1;i--){
		sum[i]=sum[i+1]+w[i];
		dp[i]=max(dp[i+1],sum[i]-dp[i+1]);
	}
	
	printf("%d %d",sum[1]-dp[1],dp[1]);
	
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值