问题模型
Wythoff博弈:有两堆石子,由两个人轮流取石子。游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子;二是可以在两堆中同时取走相同数量的石子。最后把石子全部取完者为胜者。问现在给出初始的两堆石子的数目,如果轮到你先取,假设双方都采取最好的策略,问最后你是胜者还是败者。
解题思路
动态规划
比较容易想到直接用博弈论的必败、必胜态进行动态规划:
设两堆石子数量为a和b,给定状态f,若先取者必胜令f(a,b)=1,否则先取者必败令f(a,b)=0,其中a,b都不小于0,易知f(a,b)=f(b,a),所以这里总取b大于等于a。
状态转移方程:
f(a,b)=1,若存在k使f(a-k,b),f(a,b-k)或f(a-k,b-k)等于0;
f(a,b)=0,若不存在k使f(a-k,b),f(a,b-k)或f(a-k,b-k)等于0;
动态规划的时间复杂度为O(N*M),其中N,M为两堆石子的数量。
公式
其实这个博弈问题的必败态是有规律可循的,前几个必败态的序列为
(0,0)、(1, 2)、(3, 5)、(4, 7)、(6, 10)、(8,13)、(9,15)、(11,18)、(12,20)
比较难看出来序列(a[k],b[k])规律为
a[k]=k(1+sqrt(