zoukankan      html  css  js  c++  java
  • 博弈入门

     PN分析

    P点:即必败点,某玩家位于该点,只要对方无误,则必败;

    N点:即必胜点,某玩家位于该点,只要自己无误,则必胜。

    三个定理:

    1.所有终结点都是必败点P;

    2.所有一步能走到必败点P的就是N点;

    3.通过一步操作只能到N点的就是P点

    HDU 2147 当 n 和m 全为奇数时,是必败点

    Bash Game 

                  只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜

      分析 

          如果n = m + 1;不论第一个人怎么取,第二个人能一次性拿走剩下的

          设  n = k * (m + 1) + s; 

          当 s != 0时,   假设第一个人取走了s,第二个人取走了y,然后第一个人再取走 m + 1 - y;......按着这种策略,第一个人赢

          当s = 0时,n = k * (m + 1),第一个人取y个,第二个人取m + 1 - y个,.....按着这种策略,第二个人赢

        综上,我们能得到 当n % (m + 1)  != 0 先手赢 否则后手赢

    Wythoff Game 威佐夫博弈:黄金分割

    Wythoff Game:黄金分割
    每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取
    若2堆石子的差值*(sqrt(5)+1)/2==最小值,后手赢,否则先手赢

    NIM Game

    有三堆各若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。
     
    它与二进制有密切关系,我们用(a,b,c)表示某种局势,首先(0,0,0)显然是奇异局势,无论谁面对奇异局势,都必然失败。第二种奇异局势是(0,n,n),只要与对手拿走一样多的物品,最后都将导致(0,0,0)。
    (1,2,3)也是奇异局势,无论自己如何拿,接下来对手都可以将其变为(0,n,n)的情形。
    先看(1,2,3)的按位模2加的结果:
    1 =二进制01
    2 =二进制10
    3 =二进制11 ⊕
    ———————
    0 =二进制00 
    对于奇异局势(0,n,n)也一样,结果也是0。
    任何奇异局势(a,b,c)都有a⊕b⊕c =0。
    注意到异或运算的交换律和结合律,及a⊕a=0,:
    a⊕b⊕(a⊕b)=(a⊕a)⊕(b⊕b)=0⊕0=0。
    所以从一个非奇异局势向一个奇异局势转换的方式可以是:
    1)使 a = c⊕b
    2)使 b = a⊕c
    3)使 c = a⊕b
     
    这类游戏可以推广为更加一般的形式
     

    有n堆物品,第i堆有Ai个,Alice 和Bob 可以任选一堆,取任意个,至少为1,不能不取,最后一个取光的人获得胜利

    1、n = 1,将所有物品全部拿走,先手获胜

    2、n = 2

        如果两堆物品数量相同,那么无论先手怎么取,后手可以在另一堆里面取相等数量的物品,

       如果数量不相等,先手可以先取多的那部分,这样无论后手怎么取,先手都获胜

     3 n = 3 上面已经分析过了

     我们可以得到:

    一个状态是必败状态当且仅当它的所有后继都是必胜状态 
    一个状态是必胜状态当且仅当它至少有一个后继是必败状态

    这里引入L . Bouton在1902年给出的定理:状态(x1,x2,x3)为必败状态当且仅当x1 XOR x2 XOR x3=0,这里的XOR是二进制的逐位异或操作,也成Nim和。

    也就是当Nim和!= 0时,先手胜利,否则失败 

    常考题型 :

    判断谁赢:直接定理判断就行

    限制取得最多的个数
    HDU 1851 m%(r+1);然后在进行异或求和。再根据异或和判断输赢。

    先手想赢 的话,有多少种方案

    mex

    设s是一个非负整数的集合,mex(s)为不属于集合s的最小非负整数

     sg函数

    SG(x) = mex({SG(y1),SG(y2),....,SG(yn)})   y 是x的后继节点

    1 先找必败态

    2再找他的前驱节点

    3最后计算SG值

    重复上述步骤,直到整棵树建立完成

    代码思路:

     求1~n的sg 函数的步骤

    1、使用 数组f 将 可改变当前状态 的方式记录下来。

    2、然后我们使用 另一个数组 将当前状态x 的后继状态标记。

    3、最后模拟mex运算,也就是我们在标记值中 搜索 未被标记值 的最小值,将其赋值给SG(x)。

    4、我们不断的重复 2 - 3 的步骤,就完成了 计算1~n 的函数值。

    HDU 1848 是一道模板

    对称博弈

     
     这类模型可以直接写出结论:若先手有着在第一步就取胜的方法,则先手胜;否则后手可以通过一定的操作将局面分成无法互相影响的相同的两部分,这样,先手做什么操作,后手就在另一部分上做相同的操作,所以最后一步一定是后手做的,此时先手必败。

    先写到这里吧 

    剩下的部分看大佬的博客

  • 相关阅读:
    Linux设置系统时间并同步到硬件
    centos6.9安装mysql5.7.22并设置初始密码
    mysql修改数据库文件存储位置
    mysql1.7(mysql优化,mysql-mmm软件介绍,mysql高可用集群。)
    mysql1.6(主从同步,数据读写分离)
    Mysql1.5(binlog增量备份与恢复,innobackupex)
    Mysql1.4(用户授权,权限撤销;图形管理工具,数据备份-恢复)
    MYSQL1.3(存储引擎,数据导入导出,管理表记录)
    MYSQL1.2(字段管理,索引类型)
    mysql1.1(搭建,数据类型,基本使用)
  • 原文地址:https://www.cnblogs.com/xcfxcf/p/12572051.html
Copyright © 2011-2022 走看看