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

  • 相关阅读:
    CVE-2017-10271
    [GKCTF2020]cve版签到
    [GXYCTF2019]禁止套娃 无参数RCE
    [护网杯 2018]easy_tornado
    记两道xctf上的web进阶区 反序列化
    msf卸载win defender
    Cron表达式详解
    Linux ifconfig只有lo没有别的网络的问题
    记一道文件上传
    【解决】手机安卓已经导入burp证书,但仍提示此证书并非来自被信任的机构
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6864168.html
Copyright © 2020-2023  润新知