【问题标题】:longest common subsequence matrix difference python最长公共子序列矩阵差python
【发布时间】:2018-11-20 06:01:42
【问题描述】:

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

我的问题:构建矩阵。

我最初使用 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]

【问题讨论】:

    标签: python dynamic-programming


    【解决方案1】:
    >>> 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),所以改变一个数组值会改变所有的值

    【讨论】:

    • 那么 a=[["0" for x in range(4)]for x in range(4)] 和 a=[[0] * (5) for i 之间有区别吗在范围(4)]?
    • 为什么会这样?
    • @KwokWenJian thislink 有你要找的答案
    猜你喜欢
    • 2021-04-28
    • 2018-07-17
    • 2014-11-13
    • 2011-03-01
    • 2011-02-25
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多