1143. 最长公共子序列
如果最后一样就加一,如果不一样,取两种子序列最大值,三个方向递推
class Solution:def longestCommonSubsequence(self, text1: str, text2: str) -> int:dp=[[0]*(len(text2)+1) for _ in range(len(text1)+1)]for i in range(1,len(text1)+1):for j in range(1,len(text2)+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]
53. 最大子数组和
这个之前做过了,用的是贪心
class Solution:def maxSubArray(self, nums: List[int]) -> int:res=float('-inf')cnt=0for i in range(len(nums)):cnt+=nums[i]if cnt>res:res=cntif cnt<=0:#一旦总和为负 就重新来cnt=0return res
用dp,基本上和贪心是一个思路 为负就从头开始
class Solution:def maxSubArray(self, nums: List[int]) -> int:dp=[0]*len(nums)res=dp[0]=nums[0]for i in range(1,len(nums)):dp[i]=max(dp[i-1]+nums[i],nums[i])res=max(dp[i],res)return res
1035. 不相交的线
其实就是最长公共子序列不能改顺序,注意分析题目套题库
class Solution:def maxUncrossedLines(self, nums1: List[int], nums2: List[int]) -> int:dp = [[0] * (len(nums2)+1) for _ in range(len(nums1)+1)]for i in range(1, len(nums1)+1):for j in range(1, len(nums2)+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]