如果最后一样就加一,如果不一样,取两种子序列最大值,三个方向递推
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]+1
else:
dp[i][j]=max(dp[i-1][j],dp[i][j-1])
return dp[-1][-1]
这个之前做过了,用的是贪心
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
res=float('-inf')
cnt=0
for i in range(len(nums)):
cnt+=nums[i]
if cnt>res:
res=cnt
if cnt<=0:#一旦总和为负 就重新来
cnt=0
return 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] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
return dp[-1][-1]