考虑以下问题陈述:
给定一个初始数字,您和您的朋友轮流从中减去一个完美的平方。第一个获得零胜利的人。例如:
初始状态: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
是的,我只想用此信息发布答案。另请参阅A224839。
—
Yuval Filmus