以不同方式生成2D阵列

时间:2017-07-21 14:07:39

标签: python algorithm

这是一个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。 问题是什么?

1 个答案:

答案 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]。