博弈论

一、Nim游戏及SG函数

这篇博客很详细:https://blog.csdn.net/Qiuker_jl/article/details/111302386

个人认为,sg函数的难点在于如何划分大游戏为子游戏,“子游戏”要求不能相互影响。

Nim游戏是SG函数的最基础的应用。通过Nim游戏可以更容易地理解SG函数。

例题:

板:「BZOJ1874 BeiJing2009 WinterCamp」取石子游戏

[POI2000] 条纹 :和单个取数游戏很像,区别是取完一个数,会把整段区间分成两个小区间。把一段区间看成一个独立子游戏,在区间中的某一段涂上颜色之后,会把区间分成两个小段,显然这两个小区间不会相互影响,根据SG定理,用两段子区间的SG异或值去更新大区间的SG值。

二、阶梯博弈:

把一些位置视为“废弃”位置,满足两个条件:

  1. 棋子只能从废弃位置移动到非废弃位置,或从非废弃位置移动到废弃位置。

  2. 保证后手将棋子从“废弃”位置移动到“非废弃位置”时,先手一定可以在把该棋子移入“废弃位置”。

必胜策略为:把非废弃位置上的棋子 移动到 废弃位置,可以视为删除了这个棋子。所以就等价于“只有非废弃位置”的Nim游戏。若非废弃位置上的sg函数异或和为0,则先手必败,否则先手必胜。先手必胜时,策略与Nim游戏相同。

应用:

  1. POJ1704 板题

  2. 「HDU5996」Dingyeye Loves Stone:题意:有⼀颗 \(n\) 个节点的树, \(1\) 号点为根节点,其他点上分别放有若⼲个⽯⼦,两个⼈轮流操作,每次可以将某个节点上的若⼲个⽯⼦移动到这个节点的⽗亲上⾯,⽆法操作者负,问先⼿是否必胜。

  3. HDU3389:有 \(n\)个盒⼦编号 ,每个盒⼦⾥都有⼀些卡牌。每次可以选择⼀个⾮空盒⼦ \(A\),拿任意个盒⼦⾥⾯的球到盒⼦ \(B\)\(A,B\) 盒⼦的编号必须满⾜( B<A && (A+B)%2=1 && (A+B)%3=0 )。两个⼈轮流操作,谁不能操作就输,问谁会赢。
    把编号条件限制翻译:转移只会发生在1-2,0-3,4-5 之间(这里指的时 \(\mod 6\) 的余数)。把\(1,3,4\) 定为 “非废弃位置”

三、对称博弈:

和阶梯博弈一样,也是一种套路,但是这种套路只适用于“大部分情况”后手取胜。

必胜策略为:将游戏划分为对称的两个部分,后手一直“跟着先手”。先手怎么走,后手就在其对称点走。直到游戏结束。

例:POJ2484

四、常见tips

  • 从小规模数据分析 \(N,P\) 状态的转移特点,找出数学规律,然后直接求解大规模数据的值
  • 用递推,从终止局面开始,按 \(N,P\) 状态相互转移的规律,逐步递推,最终求出初始局面的状态
posted @ 2023-09-27 11:08  bwartist  阅读(30)  评论(0)    收藏  举报