2人游戏的最佳策略

时间:2012-09-24 22:26:16

标签: algorithm

  • 2名球员A& B正在玩一个涉及数字 n
  • 的游戏
  • 玩家A进行第一步&两位球员交替进行比赛。
  • 在每次移动中,玩家取数字n,选择一个数字 i ,使得 2 ^ i< n 并将 n 替换为 k = n - 2 ^ i iff k 的二进制表示中的1的数量更大大于或等于 n
  • 的二进制表示中的1的数量
  • 当没有玩家可以移动时游戏结束,即没有这样的 i

例如:

n = 13 = b1101

只有i = 1

k = n - 2^i = 11 = b1011

同样,只有i = 2

k = n - 2^i = 7 = b111

由于玩家A不能再进行任何动作,因此玩家B获胜

我推断,在任何一步,我们只能选择一个i,这样在n的二进制表示中的相应位置上有一个0。

例如: 如果n = 1010010,那么我只能是{0,2,3,5}。

但我无法继续前进。极小极大算法并不是让我感到惊讶。我会感激任何帮助。谢谢提前

1 个答案:

答案 0 :(得分:3)

假设n不是太大,我们可以使用动态编程来解决这个问题。 定义一个数组A [1:n],其中A [i]表示玩家我是否会在输入i上获胜。 让我们使用解释:

   A[i] = 1, if A wins on input i,
   A[i] = 0, if A loses on input i.

现在A可以自下而上计算如下:

A[1] = 0, A[2] = 1.
For j=3:n { 
      Assign A[j] = 1 if there exists a number i such that (A[j-2^i] = 0) AND 
                              (number of 1's in i >=  number of 1's in j)
      Otherwise  Assign A[j] = 0 
}