zoukankan      html  css  js  c++  java
  • 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)的

  • 相关阅读:
    菜根谭#39
    菜根谭#38
    菜根谭#37
    菜根谭#36
    菜根谭#35
    菜根谭#34
    菜根谭#33
    菜根谭#32
    mysqli的使用
    mysql常用修改创建语句
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6864168.html
Copyright © 2011-2022 走看看