博弈论
博弈论适用
一般为博弈论的题目有以下标志
- 两个选手交替进行游戏
- 每个选手当前可进行的操作只与局面有关
- 游戏有至少一个终止情况
如果不满足上述条件而题目很像博弈的话,可以往dp(状压)或者其他骚东西上考虑
例如:
Gems Fight! [HDU - 4778]
思路
博弈论类题目就目前做过的题来看,一般有两种情况,要么考虑必胜局面推公式或者刷SG表找规律,要么直接码出SG函数
考虑必胜局面的做法一般先推出能一眼看出的必胜局面(最好其他局面都可以向下转化为类似这个必胜局面),然后推出其他局面和这些必胜局面的关系。有些时候需要大胆一点猜结论
码SG函数的题目一般数据范围很小,因为刷SG表复杂度是记忆化dfs的复杂度,从数据范围上也能看出一点出题人的小心思
SG函数
考虑一个博弈游戏的所有局面,将其分为两种,先手必胜和先手必败。
每一个局面经过一次合法操作所能到达的局面连一条单向边,就可构成一个类似解空间的有向树
现给出SG函数的定义
(看起来很繁琐,其实SG(x)就是与x相连点的SG值中没有出现的最小自然数)
乍一看这个函数的定义很突兀,怎么就和最小自然数联系上了?
现在假设只看
以及
两类
博弈终止局面的
值为0,代表先手必败。
现有比较浅显的定理
- 如果一个点A所连的点有一个是先手必败的点,那么点A就是先手必胜
- 如果一个点A所连的点都是先手必胜的点,那么点A就是先手必败点
现在再来考虑刚才简化的
函数
一个点A所连点存在一个
的点,那么这个点就是先手必胜(
),如果一个点A所连点都是
,那么这个点就是先手必败(
)
大多数的题目这类简化版的 函数就够用了
而取最小未出现自然数在取石子一类题目中比较常见,类似Nim游戏或者其变种。(如果没有了解过Nim游戏的可以去了解一下,这个结论的推导也是根据 函数来的)
利用完整版的 函数,可以将n堆石子的类Nim游戏分成n个1堆石子的子游戏,然后将n个子游戏的 值异或起来就是整个游戏的 值
推公式
推公式方面就是要多大胆假设,把问题往简单的数学模型上靠。
一般检测一个公式是不是正确的可以用一下3步
- 游戏的终态是不是先手必败态
- 先手必胜的局面能否移动到一个先手必败的局面
- 先手必败的局面无法移动到一个先手必败的局面
其实就是推出的式子满足最基本的胜负转换
(就先写这么多吧,也是做了一些题想总结一下,之后有时间的话再带着具体的例子来仔细讲讲)