SG函数

阅读本篇,先看这篇,里面介绍了博弈论的几种模型,并引出了SG函数,学生写的,非常好。本篇首先引用了上篇的核心内容,然后对SG函数的应用做说明。

四种基本的博弈模型:

1.巴什博弈

定义: 一堆 n n n个物品,两个人轮流从中取出不多于 m m m个,最后取光者胜,不能继续取的人输。

结论: n m o d    ( m + 1 ) ! = 0 n\mod (m+1) != 0 nmod(m+1)!=0,则先手必胜;反之,先手必输。

2.尼姆博弈

定义: n n n堆物品,每堆物品的个数任意,两人轮流取,每次取某堆中不少于1个,最后取完者胜。

结论: 将每堆物品的数量全部异或起来,若值为0,则先手必败,否则先手必胜。

3.斐波那契博弈

有一堆个数为 n n n的石子,游戏双方轮流取石子,满足:

1)先手不能在第一次把所有的石子取完;

2)之后每次可以取的石子数介于1到对手刚取的石子数的2倍之间(包含1和对手刚取的石子数的2倍)。

约定取走最后一个石子的人为赢家,求必败态。

结论: 当且仅当n不是斐波那契数时,先手胜。

4.威佐夫博弈

定义: 有两堆物品,数量分别为 a a a个和 b b b个,两人轮流取物,每次可以从一堆中取出任意个,也可以从两堆中取出相同数量的物品,每次至少要取一个,最后取完所有物品的人获胜。

结论:若 a b s ( a − b ) ∗ 5 + 1 2 = = m i n ( a , b ) abs(a−b ) ∗ \dfrac{\sqrt{5} + 1}{2}= = m i n ( a , b ) abs(ab)25 +1==min(a,b) 成立,则后手获胜,否则先手胜。其中 5 + 1 2 \dfrac{\sqrt{5} + 1}{2} 25 +1为黄金分割比,约等于1.618。

题目:

1.P2197 【模板】nim游戏

2.P2252 [SHOI2002]取石子游戏|【模板】威佐夫博弈

3.P5652 基础博弈练习题

SG函数的应用

以上四种模型都是公平组合游戏模型,任何公平组合游戏模型都可以转化为有向图游戏模型,有向图游戏模型可以转化为SG函数进行计算。

首先定义一个mex函数,mex函数就是求集合中未出现的最小的非负整数。例如mex{0,1,2,4}=3,mex{2,3,5}=0,mex{}=0。

对于一个给定的有向无环图,定义关于图的每个顶点的SG函数如下(yi是x的后继) :

S G ( x ) = m e x ( S G ( y 1 ) , S G ( y 2 ) , … , S G ( y k ) ) SG(x)=mex(SG(y1),SG(y2),…,SG(yk)) SG(x)=mex(SG(y1),SG(y2),,SG(yk))

特别地,整个有向图G的SG值被定义为有向图起点s的SG值即 S G ( G ) = S G ( s ) SG(G)=SG(s) SG(G)=SG(s)

有向图游戏的和

G 1 , G 2 , . . . , G m G_1,G_2,...,G_m G1,G2,...,Gm m m m个有向图游戏。定义有向图游戏 G G G,它的行动规则是任选某个有向图游戏 G i G_i Gi,并在 G i G_i Gi上行动一步。 G G G被称为有向图游戏 G 1 , G 2 , . . . , G m G_1,G_2,...,G_m G1,G2,...,Gm的和。

有向图游戏的和的SG函数值等于它所包含的各个子游戏SG值的异或和,即
S G ( G ) = S G ( G 1 )   x o r   S G ( G 2 )   x o r   . . .   S G ( G m ) SG(G)=SG(G_1)\ xor\ SG(G_2)\ xor\ ...\ SG(G_m) SG(G)=SG(G1) xor SG(G2) xor ... SG(Gm)

而终点也就是游戏结束局面的 S G ( x ) = 0 SG(x)=0 SG(x)=0

定理:

有向图游戏的某个局面必胜,当且仅当该局面对应节点的SG函数值大于0

有向图游戏的某个局面必败,当且仅当该局面对应节点的SG函数值等于0

下面用一道例题加深对SG函数的理解:

例题:1堆石子,有 n n n个,每次只能取{1,3,4}个石子,先取完石子者胜利,那么各个局面的SG值为多少?

解析:我们用当前还剩余的石子数表示局面, n n n表示还有 n n n个石子,即最初的状态,0表示都取完了,即终态,也是必败态。SG(x)表示此时还剩x个石子的SG函数。

x=1时,可以取走1-f{1}个石子,剩余{0}个,1的后继是0,mex{sg[0]}={0},故sg[1]=1;

x=2时,可以取走2-f{1}个石子,剩余{1}个,2的后继是1,mex{sg[1]}={1},故sg[2]=0;

x=3时,可以取走3-f{1,3}个石子,剩余{2,0}个,3的后继是2和0,mex{sg[2],sg[0]}={0,0},故sg[3]=1;

x=4时,可以取走4-f{1,3,4}个石子,剩余{3,1,0}个,4的后继是0、1、3,mex{sg[3],sg[1],sg[0]}={1,1,0},故sg[4]=2;

x=5时,可以取走5-f{1,3,4}个石子,剩余{4,2,1}个,5的后继是1、2、4,mex{sg[4],sg[2],sg[1]}={2,0,1},故sg[5]=3;

以此类推…

  x \quad \, x x 0 1 2 3 4 5 6 7 8…

sg[x] 0 1 0 1 2 3 2 0 1…

可以按照上述方法计算1~n的SG值。如果 S G ( n ) > 0 SG(n)>0 SG(n)>0,则先手必胜;如果 S G ( n ) = 0 SG(n)=0 SG(n)=0,则先手必败。

用f[]存储可以走的步数,t表示可以选择的方案,比如上述例题中, t = 3 t=3 t=3

1.可选步数为1~m的连续整数,直接取模即可,SG(x) = x % (m+1);

2.可选步数为任意步,SG(x) = x;

3.可选步数为一系列不连续的数,用GetSG()计算。

//f[]:可以取走的石子个数 
//sg[]:0~n的SG函数值 
int f[maxn], sg[maxn], vis[maxn];
void getSG(int n)
{
    int i, j;
    memset(sg, 0, sizeof(sg));
    for(i = 1; i <= n; i++)
	{
        memset(vis, 0, sizeof(vis));
        for(j = 1; f[j] <= i && j <= t; j++) 
            vis[sg[i-f[j]]] = 1;
        for(j = 0; j <= n; j++)  //求mex中未出现的最小的非负整数  
		{   
            if(vis[j] == 0)
			{
                sg[i] = j;
                break;
            }
        }
    }
}

重要:

以上是单个有向图游戏。但如果是多个有向图游戏,比如尼姆博弈,有n堆石子,可以分别求出每堆的SG函数,然后求异或和即可。

下面两道例题可以先学习下:
1.斐波那契游戏

2.英语四级考试好运!

题目:
1.P4101 [HEOI2014]人人尽说江南好

2.P2594 [ZJOI2009]染色游戏

3.P5675 [GZOI2017]取石子游戏

4.P3210 [HNOI2010]取石头游戏

5.235. 魔法珠

6.236. 格鲁吉亚和鲍勃

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值