博弈及SG函数的一点学习笔记

一点前置补充

先定义几个概念:

1.一般博弈

emmm,一个人玩多没意思。。。多个人玩情况可能太复杂,所以一般博弈讨论的就是双人间博弈,并且双人进行公平游戏,即规则相同且信息对等,两人轮流操作(即非随机选择),无法操作者判负。

2.状态

类似于DP中的状态,即当前的游戏局面。

3.必胜(败)局面

如果存在一种一定获胜的方法,那么当前局面就是必胜局面。

反之,如果不能存在一种一定获胜的方法,那么当前局面就是必败局面。

4.转移

根据规则进行的一次操作,使得当前局面改变为另一局面,这个过程就是转移。

5.显然的结论

由1,3可得,由于这是两个人的游戏,定义必胜点(即当前点对应状态)为N点(Next Player),必败点为P点(Previous Player),所以必有以下结论:

1.一个只能转移到N点的点为P点(只能使对手必胜),一个点只要能转移到P点则为N点(可以使对手必败)。

2.空状态为必败点,因为无法进行下一步操作。由此倒退可得所有情况的种类。

3.整个局面必由NP两种点组成,所以只要初始局面确定,那么能否胜利取决于先后手。

6.SG定理

1.定义一个点的SG值sg(x)为mex{y|x->y},其中{y|x->y}表示当前点的所有转移点的SG值,mex表示集合中没出现的最小自然数,如mex{1,3,4}=0,mex{0,1,2,4,5}=3。

2.如果sg(x)=0,那么x为必败点,否则为必胜点。

3.如果有多个交替进行的游戏(如在多堆石子中取),那么其SG值为所有游戏的SG值的异或和。

Nim游戏

有若干堆石子,每堆石子的数量都是有限的,合法的移动是“选择一堆石子并拿走若干颗(不能不拿)”,如果轮到某个人时所有的石子堆都已经被拿空了,则判负(因为他此刻没有任何合法的移动)。

来看这几种情况:

1.有1堆石子,每次能取任意多个石子。

好吧我承认很那啥。。。。。

首先可以知道gs(0)=0,然后就可以推出sg(1)=mex{sg(0)}=1,sg(2)=mex{sg(0),sg(1)}=2....sg(n)=mex{sg(0),sg(1),...sg(n-1)}=n。

2.有两堆石子,每次能取任意多个石子。

首先sg(0,0)=0,sg(1,0)=sg(0,1)=mex{sg(0,0)}=1,sg(1,1)=mex{sg(1,0),sg(0,1)}=0.......

然后我们就可以发现一些好van的东西:sg(a,b)=a^b。

3.再推广一下,有n堆石子,每次能从任意一堆中取任意多个石子。

我们可以发现sg(a_1,a_2,.....a_n)=a_1\oplus a_2\oplus......\oplus a_n

为什么这样计算是对的呢?

我们要证明的就是如果一个游戏可以由几个组合游戏G1,G2,G3....Gn表示,那么这个游戏的状态就可以用sg(G1)^sg(G2)^......^sg(Gn)来表示。

因为我们每次只会对一个的sg值进行改变(每次只会选择一个组合游戏进行操作),所以就是考虑证明异或和为0必败必然会转移到必胜,不为0必胜必然可以找到一个比原gs值小的数使得异或和为0。

前者很简单,\oplus_{i=1}^ngs(i)=0\Rightarrow \oplus_{i=1}^{n-1}gs(i)=gs(n),那么显然如果要让异或和为0,gs(n)是不可改变的,所以一旦改变异或和就不是0了。

后者也比较好理解,令\oplus_{i=1}^ngs(i)=k,找到k在二进制下第一位为1的位置,我们只要在所有gs值中将一个当前位为1的取反,后面赋为其他gs值后几项的异或和,因为将一个1换为了0,所以得到的新的gs值必然会比原来小。

所以证毕,如果所有游戏的gs值异或和为0,那么必败,反之必胜。

来道例题:HDU1848,题解传送门

威佐夫博弈

有两堆各若干个物品,两个人轮流从某一堆或同时从两堆中取同样多的物品,规定每次至少取一个,多者不限,最后取光者得胜。

所谓奇异局势,就是在当前局势下先手必输,前几个奇异局势通过打表可以知道是:(0,0),(1,2),(3,5),(4,7)......可以发现前后两项的差为0,1,2,3.....前一项为前面未出现的最小自然数,即mex,后一项为前一项+当前是第几项(记(1,2)为第一项)。

数据范围小的话可以通过打表过,但数据范围大了后,需要一些定理来帮助判断。

所以抛一道例题:POJ1067,题解传送门,证明都放在这道题里的。


会持续更新(update:2019.2.23)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值