博弈论学习笔记
nim游戏变种
限制取m的nim游戏
即巴什游戏+nim游戏,求出每堆数目
我们仍可从P,N来分析.假设目前为先手必败的局面,先手不管拿多少个,都会使得
假设目前先手必胜的局面,只许选择一个减少使其余数和起它异或和变为0就可(可以证明绝对可行,进一步的,若是前面有人出招,只许在同一堆石子中挑出
阶梯NIM
nim游戏的变形,两人轮流操作,每回至少从第
我们先假设偶数位置不动,两人都只移动奇数位置,容易看出这其实就是一个在奇数位置的普通nim游戏.
可是若是对手动了偶数位置的该咋办,我们只需把被增加的奇数位置增加的数目挑去即可(这样局势变回了动偶数位置前)
但是若是奇数位置取完了咋办,对手只能取偶数位置,这样奇数位置就又多出来石子,我们只需继续跟上面一样挑出石子,这样下一轮对手还是只能挑出偶数位置的石子,坚持这样终将会让对手陷入只有最后一个位置(0处)有石子的处地,也就是没法选输了
也就是说所有奇数位置石子数目的异或和不为0,先手必胜,反之必败
P3480 [POI2009] KAM-Pebbles
nim游戏变种不过每回取之后必须单调递减,可以发现由于每堆数目都大于前一堆数目,所以后减前都为正数,不妨把这个差值作为一个新的nim游戏,发现每回取走石子刚好相当于前差值减一,后差值加一,便化为了上面的阶梯nim
[SHOI2008] 小约翰的游戏
先手必胜当且仅当:
-
只有偶数个孤单堆
-
SG值不为0,且有多于一个石子的充裕堆
SG函数及定理
图游戏:
我们把游戏中各个状态都化为一个点,如果一个状态可以通过一次操作转化为下一个状态,那么就相当于连一个有向边,设最后的点为先手必败的状态,这样形成了一个DAG,其实现在这个游戏就可以转化为现在有俩绝顶聪明的人在轮流移动图上的一个棋子向下一个点,直到最后没法移动时便输了。
SG函数:
设最后的汇点的sg值为0,然后其它的点的sg值是它能到达的所有点sg值的
在有向图上推导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值的
我们可以以例题为例
P3185 [HNOI2007] 分裂游戏
题意:
现在有两个人轮流从
题解:
具有典型的Multi-SG游戏的特征,我们不妨把每一个
考虑如果是先手必败的情况,也就是说当前先手的
所以这是一个不断模仿的过程,也就是说一个瓶子会会被两个人相互取直到取完,考虑如果最后取得人和最先取的人不一样,这个子游戏便相当于输掉,
进一步的说,偶数个巧克力豆的游戏不用异或,只需要异或奇数个巧克力豆的游戏。
但是我们如果异或了偶数个的会发生什么?其实我们发现偶数个的
额,那么拿到总游戏的
树上的博弈
P9133 [THUPC 2023 初赛]大富翁
很牛的一道题,可以经过一系列式子的转化,可以把一个人选的点集集合所赚到的金币,转化为与另外一个人的选法无关的值:
最后只需把点按点权
推导式子可以参考官方题解:
P4643 [国家集训队] 阿狸和桃子的游戏
懂了就是一道大水题(也不能这样说,因为有思维),考虑到我们要求出来的是差值,所以两边加上相同的值不会产生影响,而一个人的点集里贡献要算上点权和边权,不妨把每一条边的边权平摊给两个点的点权。
这样一条边如果被分到一个点集里这一条边的贡献就会被加齐,如果分到不同点集中,因为平摊出去相同的值,所以相减得到的差会抵消掉这个影响。
所以策略应当是平摊完之后对点权排序,依次取;
启发
发现两道树上博弈并没有考虑过程,而是通过推式子的方法,来得出最后答案应当有的形式来确定策略,思考树上博弈了话可以往这个方向来考虑。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构