hdu4701 Game(递推博弈)

题意:

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)的

posted @ 2017-05-16 22:50  Chellyutaha  阅读(131)  评论(0编辑  收藏  举报