我正在尝试从https://leetcode.com/problems/nim-game/description/解决以下问题:
你正和你的朋友一起玩下面的Nim游戏:桌子上有一堆石头,每次你轮流去除1到3块石头。移除最后一块石头的人将成为赢家。你将在第一个转弯处取出石头。
你们两个都很聪明,并且拥有最佳的游戏策略。编写一个函数来确定你是否可以在堆中的石头数量的情况下赢得游戏。
例如,如果堆中有4块石头,那么你永远不会赢得游戏:无论你移走了1,2或3块石头,最后一块石头都会被你的朋友移除。
我提出了以下解决方案,使用自下而上的动态编程方法:
class Solution(object):
def canWinNim(self, n):
"""
:type n: int
:rtype: bool
"""
if n <= 3:
return True
win = [None for _ in range(n+1)]
win[1] = win[2] = win[3] = True
for n in range(4, n+1):
win[n] = not all([win[n-i] for i in [1, 2 ,3]])
return win[n]
但是,当我尝试提交此内容时,我会收到MemoryError
:
由于没有给出MemoryError
出现的确切测试用例,我正在努力查看导致问题的原因。有什么想法吗?
答案 0 :(得分:0)
正如肯尼·奥斯特罗姆所指出的那样,测试案例可能是如此之大n
,因此没有足够的内存来存储在“自下而上”中生成的答案。动态编程方法。通过在一个较小的例子上运行它,我注意到答案就是
bool(x % 4)