本文主要是介绍代码随想录算法训练营day53 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1143.最长公共子序列
1、确定dp数组以及下标的含义
长度为[0, i-1]的字符串text1与长度为[0, j-1]的字符串text2的最长公共子序列为dp[i][j]
2、确定递推公式
主要就是两大情况: text1[i - 1] 与 text2[j - 1]相同,text1[i - 1] 与 text2[j - 1]不相同
如果text1[i - 1] 与 text2[j - 1]相同,那么找到了一个公共元素,所以dp[i][j] = dp[i - 1][j - 1] + 1;
如果text1[i - 1] 与 text2[j - 1]不相同,那就看看text1[0, i - 2]与text2[0, j - 1]的最长公共子序列 和 text1[0, i - 1]与text2[0, j - 2]的最长公共子序列,取最大的。
即:dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
3、如何初始化dp数组:初始化为0
4、确定遍历顺序:从前向后遍历
5、举例推导dp数组
class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:len1 = len(text1)len2 = len(text2)dp = [[0] * (len2 + 1) for _ in range(len1+1)]for i in range(1, len1+1):for j in range(1, len2+1):if text1[i-1] == text2[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])return dp[-1][-1]
1035.不相交的线
和上一题完全相同
class Solution:def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:len1 = len(nums1)len2 = len(nums2)dp = [[0] * (len2 + 1) for _ in range(len1+1)]for i in range(1, len1+1):for j in range(1, len2+1):if nums1[i-1] == nums2[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i-1][j], dp[i][j-1])return dp[-1][-1]
53. 最大子序和
1、确定dp数组以及下标的含义
包括下标i(以nums[i]为结尾)的最大连续子序列和为dp[i]。
2、确定递推公式
dp[i]只有两个方向可以推出来:
dp[i - 1] + nums[i],即:nums[i]加入当前连续子序列和
nums[i],即:从头开始计算当前连续子序列和
一定是取最大的,所以dp[i] = max(dp[i - 1] + nums[i], nums[i]);
3、dp数组如何初始化:dp[0] = nums[0]
4、确定遍历顺序:从前向后遍历
5、举例推导dp数组
class Solution:def maxSubArray(self, nums: List[int]) -> int:if len(nums) < 1:return 0dp = [0] * len(nums)dp[0] = nums[0]result = dp[0]for i in range(1, len(nums)):dp[i] = max(dp[i-1]+nums[i], nums[i])if dp[i] > result:result = dp[i]return result
这篇关于代码随想录算法训练营day53 | 1143.最长公共子序列、1035.不相交的线、53. 最大子序和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!