【leetcode】1035. 不相交的线

54 阅读1分钟

leetcode-1035.png

最长公共子序列问题

使用动态规划来解题
定义一个二维数组 dp,其中 dp[i][j] 表示在 nums1[0...i-1] 和 nums2[0...j-1] 范围内,能够画出的最多的不交叉线数。

状态转移方程:

  • 如果 nums1[i-1] == nums2[j-1],说明可以画一条线,因此有:
    dp[i][j]=dp[i−1][j−1]+1
  • 否则,不画线,选择两个子问题中更大的结果:
    dp[i][j]=max⁡(dp[i−1][j],dp[i][j−1])
var maxUncrossedLines = function (nums1, nums2) {
    let len1 = nums1.length
    let len2 = nums2.length
    let dp = Array.from({ length: len1 + 1 }, () => new Array(len2 + 1).fill(0))
    for (let i = 1; i <= len1; ++i) {
        for (let j = 1; j <= len2; ++j) {
            if (nums1[i - 1] === nums2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1
            } else {
                dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1])
            }
        }
    }
    return dp[len1][len2]
};