Skip to content

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

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;  
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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