博弈论笔记
零、前言
NOIP2024 挂大分了。\
fz
往事流转 在你眼眸\ 一边遗忘 一边拼凑\ 如我虔诚 合十双手\ 唯愿你能 得到拯救
一、博弈论基础
定义
对于一个游戏局面,有两个玩家
本文将必胜态记为
S ,必败态记为T 。
- 必胜态:当前游戏局面存在至少一种操作方案使得游戏局面变为必败态。
- 必败态:当前游戏局面的所有操作方案都会使得游戏局面变为必胜态。
- 子游戏:将原游戏拆分成若干个同时进行的游戏,可以随机挑选一个子游戏进行操作。
Nim 游戏
给定
n 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。
问如果两人都采用最优策略,先手是否必胜。
二、一些常用思想
1. 从最简单情况开始思考
对于 Nim 游戏进行分析。
这里约定用
\{3\} 表示总共有1 堆石子,这堆石子有3 个,同理\{2,3\} 表示有2 堆石子分别为2,3 个。
- 最简单的是
n=1 ,显然先手必胜。 - 然后考虑
n=2 ,最简单的是两堆石子相等,这里开始变得较为复杂了,所以引入第二种思想。
2. 后手抵消先手
即后手可以通过模仿先手的操作,使得先手的操作无效。
- 对于
n=2 石子数量相等的情况,设两堆分别为A,B 。先手在A 拿走x 个,则后手也在B 拿走x 个。 - 此时后手可以通过这样的操作保证两堆石子数量相等,到最后一定是先手必败。
- 否则显然是先手必胜,因为先手可以先进行一步操作使得后手面临两堆石子相等的必败态。
3. 子游戏
- 如果一个局面是
\{T,T\} ,即两个子游戏都是必败态,那么显然先手必败。- 假设先手任意选择一个子游戏进行操作,则后手陪它玩这个子游戏,直到先手输了操作另一个子游戏,最后一定先手必败。
- 如果局面是
\{S,T\} 或\{T,S\} 呢?- 先手一定能通过操作一次
S 使得局面变为\{T,T\} 。 - 即后手必败,先手必胜。
- 先手一定能通过操作一次
- 如果局面是
\{S,S\} 又会怎样呢?- 这并不确定。
- 首先注意一下必胜态可以转移到必败态,也可以转移到必胜态。
- 先手一定不会选择转移到必败态,因为转移后
\{S,T\} 就会使得后手必胜,先手必败。 - 然而一个必胜态有多少个后继必胜态是未知的,所以无法确定。
这里重新思考一下,令
这个东西看上去很像或运算或者异或运算。
这里直接给出结论:所有石子数量异或和如果是
三、SG 函数(重点)
对于任意一个子游戏
u ,定义sg(u) = mex \{sg(v) | u \to v \} ,u \to v 表示可以从u 局面转移到v 局面,mex 表示集合内未出现的最小非负整数。
Nim 游戏可以直接异或的原因是
四、解题思路
1. 暴力求解 sg 值
按照定义和题目大意做,对每个局面记一个
例题:POI2000 Stripes
有一排石子共
L 个,两人交替操作,每次可以选连续一段A,B 或C 个石子,不能取石子的输,问先手是否必胜。\
SG 板子题,直接枚举局面,枚举选
2. 拆分为子游戏
- 如何设计子游戏?
- 如何求出子游戏的
sg 值? - 把子游戏合并。
例题:P3185 [HNOI2007] 分裂游戏
首先第一个问题是:怎么设计
考虑后手抵消先手,设先手从
既然答案和位置有关系,那么就设