最长公共子序列矩阵差python

时间:2018-11-20 06:01:42

标签: python dynamic-programming

我正在研究动态编程问题(最长的公共子序列)

我的问题:构建矩阵。

我最初使用dp1构建矩阵。但是它不断提出错误的答案。然后,我引用了其他答案,并使用了dp2,它产生了正确的答案。

例如:

s1 = ELGGYJWKTDHLXJRBJLRYEJWVSUFZKYHOIKBGTVUTTOCGMLEXWDSXEBKRZTQUVCJNGKKRMUUBACVOEQKBFFYBUQEMYNENKYYGUZSP

s2 = FRVIFOVJYQLVZMFBNRUTIYFBMFFFRZVBYINXLDDSVMPWSQGJZYTKMZIPEGMVOUQBKYEWEYVOLSHCMHPAZYTENRNONTJWDANAMFRX

正确答案应该是27。

  • dp1等于30
  • dp2给出27

我很困惑。有什么不同?是不是“ for _ in range(m + 1)”本质上迭代了之前的内容m + 1次?请帮帮我。

def commonChild(s1, s2):
    n, m = len(s1), len(s2)
    dp1 = [[0] * (n+1)] * (m+1)
    dp2 = [[0] * (n+1) for _ in range(m+1)]

    for i in range(m):
        for j in range(n):
            if s2[i] == s1[j]:
                dp[i+1][j+1] = dp[i][j] +1
            else:
                dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])

    return dp[-1][-1]

1 个答案:

答案 0 :(得分:2)

>>> a=[[0] * (5) for i in range(4)]
>>> a
[[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> a[0][0]=1
>>> a
[[1, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]
>>> a=[[0] * (5) ]*4
>>> a[0][0]=1
>>> a
[[1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0], [1, 0, 0, 0, 0]]

您可以自己看到差异,

[[0]*(n+1)]*(m+1)中,它是指同一个数组[0] * (n+1),因此,更改一个数组值会更改所有数组中的相同值