1 条题解
-
0
关键思路
1.单堆游戏的 SG 函数
考虑单堆硬币,从上到下编号 到 。每次操作选择某个颜色的硬币,移除它和上面的所有硬币。 这相当于:选择位置 (),若该位置硬币颜色匹配当前玩家,则移除 的所有硬币。 这是一个取石子游戏的变种,每个位置对应一个可选移动。
2.单堆 SG 值的计算
对于硬币串 (长 ),递归计算:
空堆:SG = 0
对每个位置 :
若 是蓝色,是 Natalia 的可选操作,移除后剩下
若 是红色,是 Cezary 的可选操作,移除后剩下
注意这是非对称游戏(Partizan Game),公平状态要求无论谁先手,后手必胜。
3.公平条件的转化
定义单堆 :
= Natalia 先手时是否能赢
= Cezary 先手时是否能赢
递归关系:
$win_N(S) = \bigvee_{i=1}^m [S[i] = N \land \lnot win_C(S[i+1..m])]$
$win_C(S) = \bigvee_{i=1}^m [S[i] = C \land \lnot win_N(S[i+1..m])]$
公平单堆: 且
4.多堆组合
多堆游戏:
= 存在 Natalia 在某堆的合法移动,使移动后
= 存在 Cezary 在某堆的合法移动,使移动后
公平状态要求:
Natalia 先手时无必胜策略
Cezary 先手时无必胜策略
5.实际解法
预处理所有 种硬币串的 ,分类:
: 公平单堆数量
: 仅 Natalia 先手必胜的数量
: 仅 Cezary 先手必胜的数量
: 双方先手都能赢的数量
多堆公平通常要求 类堆数 = 类堆数(对称性)。
6.算法框架
动态规划: = 用 个 类堆和 个 类堆组成公平局面的方案数。 固定前 堆的类型分布,DP 计算剩余堆的分配方案。
复杂度:预处理 ,DP ,可接受。
- 1
信息
- ID
- 3915
- 时间
- 1500ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者