我对博弈论相当陌生并且只了解正常的nim游戏,你可以用无条件来移除堆积的石头,以及最后一个移除胜利的玩家。但是在阅读Game theory tutorial on Topcoder时我遇到了一个很好的问题。要点如下:
你和一个朋友正在玩一个游戏,你可以轮流从堆中移除石头。最初,每一堆堆的石头至少与其左边的堆一样多。在整个游戏过程中必须保持此属性。在每个回合中,您从一个堆中移除一个或多个宝石。您和您的朋友交替转动,直到无法再进行有效的移动。最后一名采取行动的球员赢得了比赛。请注意,如果从桩中移除所有石头,它仍然被认为是一堆。 据说你做了一个“胜利之举”,如果做出这一举动后,无论你的朋友做什么,你最终都会获胜。给你一个int []桩,表示从左到右每堆中的石头数。轮到你了。找到一个获胜的移动并将其作为格式化为“TAKE s STONES FROM PILE k”的字符串返回(仅为清晰起见引号),其中s和k(基于0的索引)是每个没有前导零的整数。如果有多个获胜动作,请选择最小化s的动作。如果仍然存在平局,请选择最小化k的那个。如果无法获胜,请返回字符串“YOU LOSE”(仅为清晰起见)。
在这里移除宝石有一个条件,你需要保持整体非递减顺序,这成为我提出逻辑的障碍。我尝试阅读editorial,但遗憾的是无法理解它背后的想法。任何人都可以用更简单的术语解释解决方案吗?
答案 0 :(得分:0)
社论没有解释如何解决Nim的原始游戏,但只提供了维基百科页面的链接(可以找到解决方案)。
该社论刚刚解释了如何将Topcoder问题映射到Nim常规游戏的问题:
首先,游戏可以转换成一堆,其中桩具有原始桩之间的差异(因此3 6 6示例变为3 3 0)。
然后桩的顺序颠倒(因此示例变为0 3 3)。
然后在这个新游戏中的移动变成了两个步骤:从一堆中移除石头并将其添加到前一个(在该示例中,获胜移动从最后一个移动3并将它们添加到中间堆中,变成0 6 0)。
然后,如果你只看一下奇数编号的桩(#1,#3,#5等),就可以获得Nim的常规游戏,并可以对其应用一个记录的算法(所以0 3 3是与0 3的Nim位置相同。
因此给出的解释如下: