博弈入门
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:黄金分割
每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取
若2堆石子的差值*(sqrt(5)+1)/2==最小值,后手赢,否则先手赢
NIM Game
有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 是一道模板
对称博弈
这类模型可以直接写出结论:若先手有着在第一步就取胜的方法,则先手胜;否则后手可以通过一定的操作将局面分成无法互相影响的相同的两部分,这样,先手做什么操作,后手就在另一部分上做相同的操作,所以最后一步一定是后手做的,此时先手必败。
先写到这里吧
剩下的部分看大佬的博客吧