这是一个DP问题,我在python中使用2D数组解决了这个问题。
问题在于我生成2D数组的方式。
标准解决方案:
def getFloor(F, c, d):
if d == 0 or c == 0:
return 0
if c == 1:
return d
if F[c][d] == -1:
F[c][d] = getFloor(F, c, d-1) + getFloor(F, c-1, d-1) + 1
return F[c][d]
def getMaxFloor(c,d):
F = [[-1] * (d + 1) for i in range(c + 1)]
ans = getFloor(F, c, d)
return ans
print(getMaxFloor(3,4)) #prints 14
我的代码:
def getFloor(F, c, d):
if d == 0 or c == 0:
return 0
if c == 1:
return d
if F[c][d] == -1:
F[c][d] = getFloor(F, c, d-1) + getFloor(F, c-1, d-1) + 1
return F[c][d]
def getMaxFloor(c,d):
F = [[-1] * (d + 1)] * (c+1)
ans = getFloor(F, c, d)
return ans
print(getMaxFloor(3,4)) #prints 15, instead of the correct answer 14
我在初始化时检查两个数组F,返回true。 问题是什么?
答案 0 :(得分:4)
我猜测问题是,当你将它相乘时,你只是创建重复项或对同一列表元素的引用。因此,如果您更改一个,则更改另一个。然而,如果您使用for循环,它会创建单独的未链接实例,以便在更改实例时不会影响另一个实例。 (您将不得不进行大量的追踪,等等,以确切地找出答案完全正确的原因1.)但这实际上是代码之间的唯一区别所以它必定是问题。希望这会有所帮助。
例如:
l = [1,2,3]
a = [2]
l.append(a)
a[0] = 4
print l
>>>[1, 2, 3, [4]]
请注意,l中的最后一个元素是[4]而不是[2]。