博弈论学习笔记

nim游戏变种

限制取m的nim游戏

即巴什游戏+nim游戏,求出每堆数目aimod(m+1)的异或和,如果为0,则先手必败,反之先手必胜.

我们仍可从P,N来分析.假设目前为先手必败的局面,先手不管拿多少个,都会使得aimod(m+1)0(因为取的数目不能超过m;

假设目前先手必胜的局面,只许选择一个减少使其余数和起它异或和变为0就可(可以证明绝对可行,进一步的,若是前面有人出招,只许在同一堆石子中挑出m+1()即可

阶梯NIM

nim游戏的变形,两人轮流操作,每回至少从第i的位置移动一个石子到i1位置,是谁先移动完谁胜利.

我们先假设偶数位置不动,两人都只移动奇数位置,容易看出这其实就是一个在奇数位置的普通nim游戏.

可是若是对手动了偶数位置的该咋办,我们只需把被增加的奇数位置增加的数目挑去即可(这样局势变回了动偶数位置前)

但是若是奇数位置取完了咋办,对手只能取偶数位置,这样奇数位置就又多出来石子,我们只需继续跟上面一样挑出石子,这样下一轮对手还是只能挑出偶数位置的石子,坚持这样终将会让对手陷入只有最后一个位置(0处)有石子的处地,也就是没法选输了

也就是说所有奇数位置石子数目的异或和不为0,先手必胜,反之必败

P3480 [POI2009] KAM-Pebbles

nim游戏变种不过每回取之后必须单调递减,可以发现由于每堆数目都大于前一堆数目,所以后减前都为正数,不妨把这个差值作为一个新的nim游戏,发现每回取走石子刚好相当于前差值减一,后差值加一,便化为了上面的阶梯nim

[SHOI2008] 小约翰的游戏

先手必胜当且仅当:

  • 只有偶数个孤单堆

  • SG值不为0,且有多于一个石子的充裕堆

在这看题解

SG函数及定理

图游戏:

我们把游戏中各个状态都化为一个点,如果一个状态可以通过一次操作转化为下一个状态,那么就相当于连一个有向边,设最后的点为先手必败的状态,这样形成了一个DAG,其实现在这个游戏就可以转化为现在有俩绝顶聪明的人在轮流移动图上的一个棋子向下一个点,直到最后没法移动时便输了。

SG函数:

设最后的汇点的sg值为0,然后其它的点的sg值是它能到达的所有点sg值的mex值,当此点sg值为0,先手必败,反之先手必胜

在有向图上推导sg值的代码例子:

int F[MAXN];//可以转移的状态集合,一般题目会给出 
int S[MAXN];//表示该点可以转移到的状态有哪些 
int SG[MAXN];//该点的SG值 
void GetSG()
{
	for(int i=1;i<=N;i++)//枚举DAG中所有点(也可以看作拓扑排序顺序)
	{
		memset(S,0,sizeof(S));//初始化
		for(int j=1;j<=limit&&F[j]<=i;j++)//limit表示转移的集合的大小
			S[SG[i-F[j]]]=1; 
		for(int j=1;;j++)
			if(!S[j])
				{SG[i]=i;break;}//根据定义计算SG函数 
	}
}

SG定理:

游戏的和的SG值是他们的SG值的xor值。

这样我们便可以把一个游戏分解为多个子游戏,通过它们的sg值的异或和来判断是否正确。

Multi-SG游戏

有时候一些博弈游戏会出现这种情况:一个点到达的状态点可以被分为多个子游戏,这样这个状态点的sg值由定理可得是它所有子游戏的sg值的mex值。

我们可以以例题为例

P3185 [HNOI2007] 分裂游戏

题意:

现在有两个人轮流从 n瓶被标号为 0,1,...,n1 的巧克力豆中取豆子,第 i 个瓶子中装有 pi 颗巧克力豆。每一轮每人选择 3个瓶子,标号为i,j,k 并要保证 i<j,jk且第 i个瓶子中至少要有 1 颗豆子,随后这个人从第 i个瓶子中拿走一颗豆子并在 j,k中各放入一粒豆子,问先手是否有必胜策略,如果有则输出第一步操作中字典序最小的一组解和总方案数,没有则输出输出用一个空格两两隔开的三个 1

题解:

具有典型的Multi-SG游戏的特征,我们不妨把每一个 i 向所有可能的 (j,k) 连边,也就是说我们 mex 上的是 sg(j)g(k) ,然后我们的ans是子游戏的异或和,思考我们要寻找哪些子游戏?

考虑如果是先手必败的情况,也就是说当前先手的 sg 值为0,先手经过操作后,留给后手的 sg 值绝对不为0,而后手为了让先手必败,就要维持之前的 sg 值也就是0,这个时候,后手只需要模仿先手的操作,这样得到的sg值就能又回到0(可以手动模拟一下)。

所以这是一个不断模仿的过程,也就是说一个瓶子会会被两个人相互取直到取完,考虑如果最后取得人和最先取的人不一样,这个子游戏便相当于输掉,sg值为0,这个子游戏不用异或。

进一步的说,偶数个巧克力豆的游戏不用异或,只需要异或奇数个巧克力豆的游戏。

但是我们如果异或了偶数个的会发生什么?其实我们发现偶数个的 sg 值实际上竟然在预处理中竟然不为 0,这让我们大感诧异,仔细思考,这其实也是正常的,因为图上的sg值并不是它本身的sg值,只能代表联动之后的sg值,因为是不断模仿出的牌,所以我们只需要考虑最后先后手变换,所以那些转化只能代表变换先后手的也就是说,对于奇数个,联动就刚好没影响的联动完,所以可以直接套用,偶数就不行了;

额,那么拿到总游戏的 sg 值后,在先手必胜的情况下,我们可以通过寻找可以使得sg 值变为0的i,j,k作为第一次选的。

树上的博弈

P9133 [THUPC 2023 初赛]大富翁

很牛的一道题,可以经过一系列式子的转化,可以把一个人选的点集集合所赚到的金币,转化为与另外一个人的选法无关的值:aSsz[a]w[a]dep[a]

最后只需把点按点权sz[a]w[a]dep[a]从大到小排序,然后两人依次取,最后两人各自的和便是各自的答案。

推导式子可以参考官方题解:

题解

P4643 [国家集训队] 阿狸和桃子的游戏

懂了就是一道大水题(也不能这样说,因为有思维),考虑到我们要求出来的是差值,所以两边加上相同的值不会产生影响,而一个人的点集里贡献要算上点权和边权,不妨把每一条边的边权平摊给两个点的点权。

这样一条边如果被分到一个点集里这一条边的贡献就会被加齐,如果分到不同点集中,因为平摊出去相同的值,所以相减得到的差会抵消掉这个影响。

所以策略应当是平摊完之后对点权排序,依次取;

启发

发现两道树上博弈并没有考虑过程,而是通过推式子的方法,来得出最后答案应当有的形式来确定策略,思考树上博弈了话可以往这个方向来考虑。

posted @   huanghezhe  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示