Skip to content

算法训练营 Day 53 | ● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划 #50

@KoEkko

Description

@KoEkko

1143.最长公共子序列

也是需要用到二维DP,对于二维DP的公共子序列问题,dp的状态定义为什么考虑用以 nums[i-1] 和 nums[j-1] 为结尾的最长公共子序列,因为对于如何初始状态值有很大的考虑问题。
如果是以 i 和 j 为结尾的话,dp[0][j] 和 dp[i][0] 的初始化我们就得一个一个去判断是否相同然后初始化为1.
而如果是以 i - 1和 j-1为结尾的话,初始化的时候,我们只需要初始化为0即可,然后从1开始递推

function longestCommonSubsequence(text1: string, text2: string) {
  const dp = new Array(text1.length + 1)
    .fill(0)
    .map(() => new Array(text2.length + 1).fill(0));
  for (let i = 1; i <= text1.length; i++) {
    for (let j = 1; j <= text2.length; j++) {
      if (text1[i - 1] === text2[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[text1.length][text2.length];
}

1035.不相交的线

跟上道题是一样的题,只是换个描述方法而已

function maxUncrossedLines(nums1: number[], nums2: number[]) {
  const dp: number[][] = new Array(nums1.length + 1)
    .fill(0)
    .map((_) => new Array(nums2.length + 1).fill(0));
  for (let i = 1; i <= nums1.length; i++) {
    for (let j = 1; j <= nums2.length; 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[nums1.length][nums2.length];
}

53. 最大子序和 动态规划

function maxSubArray(nums:number[]):number {
  let dp = new Array(nums.length).fill(0);
  dp[0] = nums[0];
  let result = dp[0];
  for(let i = 1; i < nums.length; i++) {
    dp[i] = Math.max(dp[i-1] + nums[i], nums[i]);
    result = Math.max(result, dp[i]);
  }
  return result;  
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions