关于动态编程:最常见的子序列矩阵差异python

longest common subsequence matrix difference python

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

我的问题是:构建矩阵。

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

例如:

s1=elggyjwktdhlxjrbjlryjwvsufzkyhoikbgtvuttocgmlexwdsxebkrztquvcjngkkrmuubacvoeqkbffybuqemynkyyguzsp

s2=frvifovjyqlvzmfbmrutiyfbmfffrzvbyinxlddsvmpwsqgjzytkmzipgmvouqbkyeweyvolshcmhpazytenrntjwdanamfrx

正确答案应该是27。

  • DP1给出30
  • DP2给出27

我很困惑。有什么区别?"for_uu in range(m+1)"不是本质上迭代m+1次之前的内容吗?请帮帮我。

1
2
3
4
5
6
7
8
9
10
11
12
13
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
2
3
4
5
6
7
8
9
10
>>> 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),因此更改一个数组的值会全部更改相同的值。