博弈论是研究具有斗争或竞争性质现象的数学理论和方法。
每个玩家都有一个偏好,A一般是希望A赢,如果不可以的话就倾向于 平局,B一般倾向B赢,达不到的话就倾向于平局。他们的每一步组成了一个“函数”,或者说是“映射”,即每一步操作都会对应一种结果,而每一步又都不是固定的,是根据上一步来产生......
“一般的博弈游戏是非常复杂的,一般算不出答案,所以在算法考试中一般不考,考得多的是下面的‘组合游戏’”
组合游戏 给了限制,给问题做了简化
“ 状态的转移” -> “有向无环图”
0个石子为结束状态,0可以由1得来,可以由2得来,由3得来...4可以到达3,2,1.....。21为起点,这个可以在有限步内结束。
Bash游戏是一个组合游戏
讨论这个游戏的最优策略,以及在最优策略下谁会赢
注意上图的“性质”,与Bash游戏无关,所有的组合游戏都适用。
浅解释:对于上图,玩家A到达0后玩家B就不能再取了,游戏结束(A胜),所以0为P态(A走到0,A胜);到达1的玩家,取走这一个石子后下一玩家到达0,则走下一步的玩家赢 该玩家败,1为N态;……能到P态的都是N态,我们称“当前玩家” 为从当前这个状态往下走的玩家,则P态:当前玩家输,N态:当前玩家赢。对于P态,无论怎么走都会输,所以就是最优策略了,而N态 要到达P态,使自己赢。
P N态是我们分析博弈问题的一个最基础的工具。【一般都是倒推】
确定终态:正常规则与反常规则
Bash游戏是正常规则,那么反常规则的Bash游戏呢?(照样倒着 “递推”)
所以一个非常重要的"万能"的方法就是: 打表(学会了打表,博弈题基本上就解决了一半)
我们再回过头来看第一题,他不满足 组合游戏的定义(组合游戏不会有平局),但依然可以用其思想来解决,这里可以dp、递推,我们只关心那些“数对”(回文判定时的首尾呼应的数对)的个数,而它们具体在什么位置我们并不关心,“1-1”就可以不用管了,下图的f, 我们要记录“0-0”对的数量,“0-1”对的数量,0的个数,以及上一步是否进行了翻转操作....
分析:
(这里手动“打表”了先)N=0时,P态(正常规则);N=1时,可以全部取走,N态;
N=2时,设这两堆:x1>=x2>0; 首先,显然(emogg说的,受伤了啊我),x1==x2 为P态,因为我们从x1取一部分走(放不放到x2都一样) 变成 y, x2 ,如果y=0, 那就进入N=1的N态了->此时x1==x2为P态;若y!=0, 第二个玩家总能将其变为相等的两堆:在x2那堆拿走(x2-y)个石子....也就是总与上个玩家“作对”,这样x1>x2就是N态。N=3时,是N态,设x1>=x2>=x3>0 ,那么从x1拿(x2-x3)个给x3(多的扔掉), 得到 0,x2, x2(P态); 我们是可以保证x1>(x2-x3)的(因为x1>=x2, x2>x2-x3啊)所以N=3为N态;
结论:
1.N是奇数->N态;
2.N是偶数时,两两成对就是P, 否则是N;
证明:
先全都排个序:x1>=x2>=x3>=...>=xn;
N是奇数的时候,取最大的那个,分配到后面(全部=x2)x1 >( x2-x3)+(x4-x5)+(x6-x7).....+(X[n-1] - X[n]) 只要把后面括号顺序改一下就可以看出来了:x1 > x2 (- x3+x4) (-x5+x6) (-x7..)...( +X[n-1] ) - Xn; 括起来的都是小于0的,又x1>=x2 ....
N是偶数的时候,两两成对为P态,不成对则可以一步变成两两成对的P态->为N态,详见下图吧。。