1143、最长公共子序列:
class Solution(object):
def longestCommonSubsequence(self, text1, text2):
"""
:type text1: str
:type text2: str
:rtype: int
"""
dp = [[0] * (len(text2)+1) for _ in range(len(text1)+1)]
res = 0
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
res = max(res, dp[i][j])
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
return res
本题和最长重复子数组的区别在于,子序列可以不连续,因此对于不相同的字符,要判断和处理取值的情况,是取dp[i-1][j]和dp[i][j-1]的最大值
1035、不相交的线:
class Solution(object):
def maxUncrossedLines(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: int
"""
dp = [[0] * (len(nums2)+1) for _ in range(len(nums1)+1)]
res = 0
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
res = max(res, dp[i][j])
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
return res
和上题一样,算是套了个壳子,只要能抽象出来题意是求最大公共子序列就没啥问题
53、最大子数组和:
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dp = [0] * len(nums)
dp[0] = nums[0]
res = dp[0]
for i in range(1, len(nums)):
dp[i] = max(nums[i], dp[i-1] + nums[i])
res = max(res, dp[i])
return res
相比于贪心解法,dp的解法更直观