hdu4701 Game(递推博弈)

本文解析了一种基于轮流动态购买物品的博弈游戏算法。通过递推方式确定玩家获胜条件,利用dp数组优化状态表示,最终得出玩家是否能赢得游戏的结论。

题意:

Alice初始有A元,Bob有B元。

有N个物品,第i个物品价值为Ci。Alice和Bob轮流买一些(>=1)物品。不能移动的人输。购买有一个限制,对于第1

个之后物品,只有当第i-1个物品被购买后,第i个物品才能被购买。

保证两人都是最优操作,Alice先手,问谁将取得胜利。

1<=n<=1e6;0<=A,B<=1e9;1<=Ci<=9

分析:

这种博弈问题,一看就是需要递推来求解的

考虑dp[x][money]表示现在这个人有money元,即将面对x..n这么多物品,能否获胜

这样的状态是爆炸的,但是这样的状态如果只存0 1有点浪费,所以可以改进一下状态表示

dp[x]表示现在某个人面对x..n这么多物品,如果想要获胜,至少现在手上要有多少钱

我现在手里有这么多钱:dp[x]

对方手里现在有这么多钱:A+B-sum[x-1]-dp[x]

那么怎么转移呢?

我要赢,我可以枚举从x开始买多少个物品,那么就对应后面的一个状态y>x,满足dp[y]<对方手里的钱 并且 我买的y-x之间的物品我要能承担起

也就是dp[x]>=sum[y-1]-sum[x-1] 并且 A+B-sum[x-1]-dp[x]+1<=dp[y]

也就是dp[x]>=max(sum[y-1]-sum[x-1],A+B+1-sum[x-1]-dp[y])

那么dp[x]肯定是这些y中最小的

也就是dp[x]=min(max(sum[y-1]-sum[x-1],A+B+1-sum[x-1]-dp[y]))=min(max(sum[y-1],A+B+1-dp[y]))-sum[x-1]

这个从后往前一扫是O(n)的

转载于:https://www.cnblogs.com/wmrv587/p/6864168.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值