编程之美 set 18 拈两堆石子游戏(3)
题目
假设有两堆石头, 有两个玩家按照如下规则轮流取石头
每个人每次可以从两堆石头中取出数量相等的石头, 或者仅从一堆石头中取出任意数量的石头
最后把剩下的石头依次拿光的人取胜
首先取石头的人能否赢得这个游戏
分析
1. 我们先定义先取者有必胜策略的局面为 "安全局面", 而先取者无必胜策略的局面为 "不安全局面"
2. 根据枚举 (10,10) 范围内石头的可能组合, 发现不安全局面的局面有 <1,2>, <3,5>, <4,7>...
3. 不安全局面的特点是 b = a + i, i = 1, 2, 3.., 若 a1, b1, ... an-1, bn-1 已经求得, 则定义 an 为未出现在这 2n-2 个数中的最小整数
4. 由以上的分析, 可以从下到上去推, 自底向上, 时间复杂度为 o(N)
5. 转化成数学问题, 求解通项公式, 时间复杂度降低到 o(1)