博弈论
一、Nim游戏及SG函数
这篇博客很详细:https://blog.csdn.net/Qiuker_jl/article/details/111302386
个人认为,sg函数的难点在于如何划分大游戏为子游戏,“子游戏”要求不能相互影响。
Nim游戏是SG函数的最基础的应用。通过Nim游戏可以更容易地理解SG函数。
例题:
板:「BZOJ1874 BeiJing2009 WinterCamp」取石子游戏
[POI2000] 条纹 :和单个取数游戏很像,区别是取完一个数,会把整段区间分成两个小区间。把一段区间看成一个独立子游戏,在区间中的某一段涂上颜色之后,会把区间分成两个小段,显然这两个小区间不会相互影响,根据SG定理,用两段子区间的SG异或值去更新大区间的SG值。
二、阶梯博弈:
把一些位置视为“废弃”位置,满足两个条件:
-
棋子只能从废弃位置移动到非废弃位置,或从非废弃位置移动到废弃位置。
-
保证后手将棋子从“废弃”位置移动到“非废弃位置”时,先手一定可以在把该棋子移入“废弃位置”。
必胜策略为:把非废弃位置上的棋子 移动到 废弃位置,可以视为删除了这个棋子。所以就等价于“只有非废弃位置”的Nim游戏。若非废弃位置上的sg函数异或和为0,则先手必败,否则先手必胜。先手必胜时,策略与Nim游戏相同。
应用:
-
POJ1704 板题
-
「HDU5996」Dingyeye Loves Stone:题意:有⼀颗 \(n\) 个节点的树, \(1\) 号点为根节点,其他点上分别放有若⼲个⽯⼦,两个⼈轮流操作,每次可以将某个节点上的若⼲个⽯⼦移动到这个节点的⽗亲上⾯,⽆法操作者负,问先⼿是否必胜。
-
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\) 状态相互转移的规律,逐步递推,最终求出初始局面的状态
本文来自博客园,作者:bwartist,转载请注明原文链接:https://www.cnblogs.com/bwartist/p/17732228.html

浙公网安备 33010602011771号