难道这是一个NP完全问题?


10

考虑以下问题陈述:

给定一个初始数字,您和您的朋友轮流从中减去一个完美的平方。第一个获得零胜利的人。例如:

初始状态:37

玩家1减去16。状态:21

玩家2减去8。状态:13

玩家1减去4。状态:9

玩家2减去9。状态:0

Player2获胜!

编写一个程序,该程序给出一个初始状态,并返回最佳动作,即可以确保赢得比赛的动作。如果没有任何可能的举动会导致您进入获胜状态,请返回-1。

使用动态规划可以在伪多项式时间内解决此问题。这个想法只是用最佳移动从下往上填充长度为n(其中n是初始状态)的数组,如果没有移动导致获胜,则为-1。这将花费O(n * sqrt(n)),因为对于每个数字,我们都需要考虑减去每个可能的小于它的理想平方(其中有〜sqrt(n)个)。但是,这是伪多项式运行时复杂性,因为运行时实际上相对于二进制(用于表示数字的位数)的大小与输入大小成比例关系。

谁能想到解决这个问题的多项式算法?如果没有,那么它可以是NP-Complete吗?为什么?


1
出于好奇,您为什么特别要问它是否是NP完整的?(就我个人而言,我猜想它甚至不在NP中,尽管我真的不知道。)
ruakh

@ruakh我最近在一次编码采访中遇到了这个问题,并提出了使用我描述的动态编程的伪多项式解决方案。但是,在仔细考虑问题之后,我无法提出多项式时间算法。我很快开始质疑自己,这是否实际上不是NP(-Complete)问题。
Martin Copes

您是否尝试过计算哪些头寸是赢利头寸,哪些头寸是亏损头寸?也许会出现一种模式。
Yuval Filmus

@YuvalFilmus根据维基百科,这种模式(OEIS中的序列A030193)尚无已知公式
Martin Copes

是的,我只想用此信息发布答案。另请参阅A224839。
Yuval Filmus

Answers:


6

损失仓位序列可以在OEIS中找到,A030193格林纳德值为 1 的仓位序列也可以在A224839中找到。百科全书引用了几篇相关文章。也许其中一些人讨论了计算序列的非平凡算法。


正如您提到的,此序列代表亏损头寸。即使您能够在固定时间内检查头寸是否丢失(这看起来很难!),问题仍然会要求您返回最佳移动,即,您需要减去当前状态的平方才能到达失去位置。问题将归结为通过从当前状态减去平方来找到亏损位置。因此,即使您可以检查某个头寸是否在恒定时间内丢失,您仍然需要遍历小于状态的所有平方。
Martin Copes

3
是的,这还不够,但这将是一个好的开始。也许您可以仅通过计算仓位的获胜状态来获得一些见识。另外,表明很难决定失去哪个头寸将足以表明您说的问题在任何合理的决策版本中都是NP-hard。
Yuval Filmus
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.