zoukankan      html  css  js  c++  java
  • hdu4778(状态压缩dp)

    题意:

      有G种颜色的宝石,共B袋。两个人轮流拿宝石,每次从B袋中拿一袋,把其中的所有宝石倒入一个公共容器,每袋宝石只能取一次。

      当容器中有S个相同颜色的宝石时,将失去这S个宝石,当前操作者得到一个魔法石,每次得到一个魔法石,作为奖励,他都可以再次拿一袋宝石倒入容器。

      双方都想让自己的魔法石尽量多,Alice先手,问在最优操作下,Alice 和 Bob的魔法石差是多少。

      0 <= B <= 21, 0 <= G <= 8, 0 < n <= 10, S < 20。

    分析:

      因为数据很小,所以考虑用状态压缩来表示

      对于状态S,若某位为0,则说明该位的袋子没有丢到容器中,若某位位1,则说明该袋子已经丢到了容器中,f[S]表示S状态下,先手-后手的最大值

      显然答案ans=f[0]

      考虑初始情况f[(1<<n)-1]=0(因为这表示所有袋子都已经丢到了容器中,在剩余的袋子中,先手后手都无法取,0-0=0)

      枚举状态S的每一个数字0的位置i

      f[S]由f[S|1<<i]逆推得到

      若将i丢进容器,没有获得魔法石,那么f[S]=max(f[S],-f[S|1<<i]) (因为交换了先手后手顺序)

      若将i丢进容器,获得了魔法石,那么f[S]=max(f[S],f[S|1<<i]+丢进i获得的魔法石) (因为获得了魔法石,所以先手仍旧是先手)

      注意dp过程中计算某个位置的贡献,这是可以预处理的

      复杂度O(2^B * B * G)

  • 相关阅读:
    kubernetes排错系列:(一)、机房搬迁导致的节点NotReady
    kubernetes学习:CKA考试认证(二)
    kubernetes学习:CKA考试题
    kubernetes学习:CKA考试认证
    Pycharm中连接数据库乱码问题解决
    Matplotlib——中级
    Numpy
    Matplotlib——初级
    Matplotlib中中文不显示问题
    CentOS系统安装
  • 原文地址:https://www.cnblogs.com/wmrv587/p/6649339.html
Copyright © 2011-2022 走看看