题意:
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)的