一本通提高篇 博弈论

0. 0. 0.写在前面

爷青回系列了属于是,因为比赛博弈论连着被打烂三天,想找点博弈论题做,做完洛谷题单之后想到了还有这本书的题单可以做哈哈哈,顺手更新一下这个题单,确实好久没更新了。

1. 1. 1.随便讲讲

1.0 随便说说

第一次接触博弈论应该是在小学奥数,小学奥数真的什么题都有,好有意思,老师会在课间在黑板上画几个模型找同学上来玩,赢了有奖励哈哈哈,最后会介绍最优解的策略。

A C M ACM ACM中的博弈论也会有像找规律的简单博弈论题目,但是多数难一点的题目还是要应用到博弈论知识,比如 S G SG SG定理,最近几天比赛疯狂被 S G SG SG定理薄纱,所以才有了这篇博客。

1.1 公平组合游戏 ( I C G ) (ICG) (ICG)

  • 两名选手,交替进行预先规定好的操作
  • 在任何情况下,合法操作只取决于情况本身,与选手无关
  • 游戏失败的最终判定往往是选手无法进行合法操作了

对于算法竞赛中出现的博弈论题目,大多都是这种公平组合游戏的模型。
非公平组合游戏的取胜策略一般不在算法竞赛的讨论中,如五子棋,象棋,围棋等。

1.2 简单博弈论的几个模型

1.2.1 巴什博弈

一堆有 n n n个物品,每次取 1 − m 1-m 1m个拿走,拿到最后一个物品的赢。
结论: m + 1 ∤ n m+1\nmid n m+1n先手赢, 1 + m ∣ n 1+m\mid n 1+mn后手赢。

其实很好理解,当剩余的物品数为 m + 1 m+1 m+1的倍数时,我们就和对手对着取,对手取 i i i我们取 m + 1 − i m+1-i m+1i。所以先手先拿走物品数除以 m + 1 m+1 m+1的余数,然后跟对手对着取,这就是先手获胜的策略。若开局物品数就是 1 + m 1+m 1+m的倍数,那会被对手对着取,所以后手获胜。

1.2.2 斐波那契博弈

一堆有 n n n个物品,第一次随便取,但不能取完,以后每次取的物品数不能超过上次的两倍,取了最后一个的获胜。
结论: n n n为斐波那契数后手赢,否则先手赢。

1.2.3 威佐夫博弈

有两堆物品分别有 n , m n,m n,m个,两个人轮流从任意一堆中至少取出一个或者从两堆中取出同样多的物品,规定每次至少取一个,至多不限,最后取光者胜。
结论: ( n − m ) × (n-m)\times (nm)×黄金分割比 = m =m =m后手赢,否则先手赢 ( ( (不妨设 n > m ) n>m) n>m)

1.3 I C G ICG ICG游戏模型

1.3.1 有向图游戏

给定一个有向无环图和一个起始顶点上的棋子,两名选手交替地将这枚棋子沿着有向边进行移动,最后无法移动的失败。

对于一个 I C G ICG ICG游戏,可以把每个局面看作顶点,对该局面和它的后继局面连一条有向边进行构建一个有向图,我们把它叫做博弈图。

我们通过把一个 I C G ICG ICG游戏转化为多个上述的有向图游戏的组合,再通过寻找这个游戏的一般解法,来处理 I C G ICG ICG问题。

1.3.2 性质

我们很容易可以得出下面三条性质:
1 1 1:没有后继状态的状态是必败状态。
2 2 2:一个状态是必胜状态当且仅当存在至少一个必败状态为它的后继状态。
3 3 3:一个状态是必败状态当且仅当它的所有后继状态均为必胜状态。

1.4 S G SG SG函数

1.4.1 定义

S G SG SG函数表示当前位置的一个胜败情况, S G ( x ) > 0 SG(x)>0 SG(x)>0代表在 x x x状态开始有向图游戏先手必胜,反之 S G ( x ) < 0 SG(x)<0 SG(x)<0代表 x x x状态先手必败。

1.4.2 计算

定义 m e x mex mex运算: m e x { S } = m i n { x } , x ∈ S , x ∈ N mex\{S\}=min\{x\},x\in S,x\in \mathbb{N} mex{S}=min{x},xS,xN
对于状态 x x x,假设其后继状态为 y 1 , y 2 , . . . , y n y_1,y_2,...,y_n y1,y2,...,yn
S G ( x ) = m e x { S G ( y 1 ) , S G ( y 2 ) , . . . , S G ( y n ) } SG(x)=mex\{SG(y_1),SG(y_2),...,SG(y_n)\} SG(x)=mex{SG(y1),SG(y2),...,SG(yn)}

1.4.3 理解

如何理解呢,当 S G ( x ) = 0 SG(x)=0 SG(x)=0,代表对于任意 i , S G ( y i ) > 0 i,SG(y_i)>0 i,SG(yi)>0,对应上述结论 3 3 3,即必败态的后继均为必胜态。
S G ( x ) ≥ 1 SG(x)\ge 1 SG(x)1,代表存在 i , S G ( y i ) = 0 i,SG(y_i)=0 i,SG(yi)=0,对应上述结论 2 2 2,即必胜态的后继中有必败态。
因此我们就求得了 S G SG SG函数。

1.4.4 意义

S G ( x ) = 0 SG(x)=0 SG(x)=0代表 x x x状态为 0 0 0级胜态,即为必败态
S G ( x ) = n SG(x)=n SG(x)=n代表 x x x状态为 n n n级胜态,即为必胜态

对于胜态的一个小性质:
一个胜态可以转化为任何一个比他级数小的胜态(包括 0 0 0级胜态,即必败态)。
上述的解释很简单,因为我们是用 m e x mex mex S G SG SG函数进行求解,如果 S G ( x ) = n SG(x)=n SG(x)=n x x x的后继状态中一定包含 0 , 1 , 2 , . . . , n − 1 0,1,2,...,n-1 0,1,2,...,n1级胜态,因此可以转移到任何一个比他级数小的胜态

1.5 S G SG SG定理

1.5.1 定理内容

对于一个由 n n n个有向图游戏组成的 I C G ICG ICG游戏,设他们的起点分别为 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,则当且仅当 S G ( x 1 ) ⊕ S G ( x 2 ) ⊕ . . . ⊕ S G ( x n ) ≠ 0 SG(x_1)\oplus SG(x_2)\oplus ...\oplus SG(x_n)\neq0 SG(x1)SG(x2)...SG(xn)=0时先手必胜,反之先手必败。其中 ⊕ \oplus 代表按位异或运算。

1.5.2 证明

结论很有意思,可用数学归纳法证明,略。(其实是我不会证明

1.5.3 应用

S G SG SG 定理适用于 任何公平的两人游戏, 它常被用于决定游戏的输赢结果。

2. 2. 2.例题

取石子游戏 1

题面
非常常见的一个板子题,看网上说这个叫巴什博弈,可以拿的数量为 1 − m 1-m 1m,对于对手拿 i i i,我们拿 1 + m − i 1+m-i 1+mi,因此先手时只需把除以 m + 1 m+1 m+1的余数拿走即可,当总数量被 m + 1 m+1 m+1整除时后手获胜,反之先手获胜。

#include
using namespace std;
int n,k;
int main(){
    cin>>n>>k;
    if(n%(1+k))puts("1");
    else puts("2");
}

取石子游戏 2

题面
经典的 N i m Nim Nim游戏, s g i = n sg_i=n sgi=n,取所有的石子堆的异或和,若为 0 0 0则后手胜,反之先手胜。

#include
using namespace std;
inline void read(int &x){
    int s=0,w=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){s=(s<<3)+(s<<1)+(ch&15);ch=getchar();}
    x=s*w;
}
int n,x,ans;
int main(){
    read(n);
    for(int i=1;i<=n;i++)read(x),ans^=x;
    if(ans)puts("win");
    else puts("lose");
}

你可能感兴趣的:(一本通,数论,c++,算法,数论,概率论,概率,期望)