在我的一次采访中,我被问到了这个问题。问题就像这样
你有一个'+'和' - '字符串(例如++ ---- ++++++ - + - +)。有两个玩家玩家1和玩家2.在每个回合中,其中一个玩家可以选择任意两个连续的'+',即++并将其翻转为 - 。因此,如果初始字符串是++ ---- ++++++ - + - +然后播放器有以下6个选项(2-7)。(第一个用于参考)。
玩家逐个转弯。 玩最后一步的玩家将获胜(或失败 - 没有任何区别)。
给定一个初始字符串,如果玩家1进行第一次转弯,我们必须告诉谁赢了?
现在这看起来像是一个经典的游戏理论问题,每个玩家都试图以最佳方式进行游戏,并且每一步都会进行一次移动,将他移动到获胜位置。
关于如何解决此问题的任何想法?
PS - 对方法感兴趣而不是解决问题。我已阅读http://www.codechef.com/wiki/tutorial-game-theory,但无法在此处应用相同的逻辑。答案 0 :(得分:0)
我们可以在这里使用Grundy功能,因为在将++转换为 - 之后,游戏被分成两个独立游戏的总和:从左到右,向右。假设g(l,r)是给定字符串的[l,r]区间的Grundy函数的值。为了计算它,我们可以尝试将++更改为 - 在所有可能的位置,存储所有g(l,k - 1)xor g(k + 2,r)(其中k是++开始的位置)值并选择不在其中的最小非负整数。基本情况的值(当没有可能的移动时)是0或1(取决于最后一个玩家是输或赢)。当且仅当g(0,n-1)(n是输入字符串的长度)非零时,第一个玩家获胜。该解决方案具有O(n ^ 3)时间复杂度(存在O(n ^ 2)个可能(l,r)对,并且我们可以计算每个线性时间的thr回答。