博弈论入门
0x00-前(che)言(dan)
博弈论在OI技能树上的标签是 \(\color{#9D3DCF}{提高/省选/NOI}\) 的,但是一些基础还是可能在初赛的问题求解考到的,(虽然主要考组合数学),但是早学晚学都得学
其实博弈论的精髓就在于一个转移迭代:
如果这种情况能有必胜策略,那么它一定能转移到一个有必胜策略的情况。 这就是一个递归迭代的问题,又㕛叒叕是DP。
0x01-Bash Game
Bash Game 应该是最简单的一种博弈论了,应该小学生都会的吧。
内容如下:
有一堆石子,石子数量为 \(N\) 。一次可以取 \(x\) 个石子, 其中 \(a\le x \le b\) ,不可以不取,谁取到最后一颗就谁赢,给出 \(a,b,N\) ,求是否存在先手必胜的策略。
其实这个问题很简单,只要保证 \(N \mod \left( a+b \right) = 0\) 就没有,否则有,下面给出策略:
如果 \(N \mod \left( a+b \right) = 0\) 那么就后手取有必胜策略,我们发现,只要第一个人取 \(x\) 颗,我们就取 \(a+b-x\) 颗就可以了,这样一轮下来我们就有 \(a+b\) 颗石子被取走,那么就可以取到最后一颗了。并且对方无论怎么取你都可以让总数为 \(a+b\) 其他的数字就不可以了。
代码略。
0x02 Nim Gmae
这是一个非常经典的博弈论了,不过因为我太菜了所以我就只会过模板。
在洛谷上查看
洛谷上的难度:\(\color{green}{普及+/提高}\)
问题是这样的:
有 \(N\) 堆石子,每堆的数量分别为 \(a_i \left( 1\le i\le N\right)\) ,每个人从同一堆石子里面取任意数目的石子,取到最后一个的人赢,请问是否存在先手必胜策略。
结论如下:当 \(a_1\oplus a_2\oplus a_3\dots a_N \not= 0\) 的时候,先手存在必胜策略。
不难得出必胜策略如下:
首先在去一些石子,使 \(a_1\oplus a_2\oplus a_3\dots a_N = 0\) ,然后反复进行就可以了,最后当 \(a_1= a_2=a_3=\dots =a_N = 0\) 的时候就胜利了,因为最后的结果的异或起来也是 \(0\) 。
0x03 Wythoff Game
这个应该是三个之中最难的了。
问题如下:
有两堆石子,可以在一堆石子中取任意个数的石子,也可以同时在两堆石子取相同个数的棋子,但不能不取,两对石子分别有 \(a\) 个和 \(b\) 个,问先手是否有必胜策略。
感觉找不出规律,俗话说得好:暴力出奇迹,打表出省一,那么我们手动模拟打张表吧。
这里令 \(a<b\) (因为 \(a=b\) 肯定是先手必胜)
然后我们就会发现基本上的结果是先手必胜,但是有少数例外:
\(a\) | \(b\) |
---|---|
\(0\) | \(0\) |
\(1\) | \(2\) |
\(3\) | \(5\) |
\(4\) | \(7\) |
\(6\) | \(10\) |
\(8\) | \(13\) |
\(9\) | \(15\) |
\(11\) | \(18\) |
我们把这些结果称为 奇异局势 ,通过打表我们发现一个神奇的结论:
\(\lfloor 1.618a \rfloor=b\) 而 \(1.618\) 其实就是 黄金分割比 \(+1\) 就是 \(1+\dfrac{\sqrt{5}-1}{2}\) ,而向下取整刚好可以使用我们C++
的强制转型(int)
而Wythoff Game的精髓以及射你之处也就在这里了。
0x04 后记
当然,博弈论和其他算法一样,只有下限没有上线,像我这种蒟蒻怎么讲的动那些蓝紫黑博弈论呢? 所以遇到博弈论的时候要记住博弈论必胜策略转移的精髓:如果这种情况能有必胜策略,那么它一定能转移到一个有必胜策略的情况。
最后遇到不会的题目就可以 暴力出奇迹,打表出省一 来得到一定的分数。