博弈论
博弈论
Bash Game
巴什博弈:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取光者得胜。
分析
先剖析题意——每次可以取1~m个,那存在如下几种情况:
- n%(m+1)==0,此时,无论先手取几个,后手都可以取i个使每轮是m+1个,最终先手必输。
- n%(m+1)!=0,此时先手先取n%(m+1)个,后手取k个,先手再取l个使k+l=m+1,最后一次即为先手取得。
例子
NIm Game
Nim Game:m堆n个物品,两人轮流取,每次取某堆中不少于1个,最后取完者胜
分析
所有物品数目二进制异或 为0,则先手必输所有物品数目二进制异或不为0,则后手必输
从另一个角度思考这个问题,如果物品数量随机,那么每个数目的每一位上1或0概率相同,
如果有奇数个堆,那么1的个数为偶数或者奇数的概率相同,
如果有偶数个堆,那么1的个数为偶数的概率略大1/(m+1),
也就是说异或结果的每一位为0或1的概率几乎差不多,而先手必输要求异或结果每一位都为0,其实输的概率很小
例子
SG函数
当我们面对由n个游戏组合成的一个游戏时,只需对于每个游戏找出求它的每个局面的SG值的方法,就可以把这些SG值全部看成Nim的石子堆,然后依照找Nim的必胜策略的方法来找这个游戏的必胜策略了!(Nim其实就是n个从一堆中拿石子的游戏求SG的变型,总SG=n个sg的异或)。(very important)解题模型:
- 把原游戏分解成多个独立的子游戏,则原游戏的SG函数值是它的所有子游戏的SG函数值的异或。
即sg(G)=sg(G1)^sg(G2)^…^sg(Gn)。
分别考虑没一个子游戏,计算其SG值。
SG值的计算方法:(重点)
可选步数为1~m的连续整数,直接取模即可,SG(x) = x % (m+1);
可选步数为任意步,SG(x) = x;
可选步数为一系列不连续的数,用模板计算。
模板一:打表
1 | const int MAX_DIG = 64; |
模板二:DFS
1 | const int MAX_DIG = 64; |
一般DFS只在打表解决不了的情况下用,首选打表预处理。
例子(打表)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 AnjoyのBlog!
评论
