300.最长递增子序列
dp表示以nums[i]结尾的最长递增子序列的长度
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
# initialization
dp = [1]*len(nums) # dp表示以nums[i]为结尾的最长递增子序列的长度
dp[0] = 1
for i in range(1, len(nums)):
for j in range(0, i):
if nums[i] > nums[j]:
dp[i] = max(dp[j]+1, dp[i])
result = max(dp)
return result
674. 最长连续递增序列
dp[i]表示以nums[i]为结尾的最长连续递增子序列的长度,配合最后result=max(dp)
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
# initialization
dp = [1]*len(nums)
dp[0] = 1 # dp[i]表示以nums[i]为结尾的最长连续递增子序列的长度
for i in range(1, len(nums)):
if nums[i] > nums[i-1]:
dp[i] = dp[i-1]+1
# print(dp)
result = max(dp)
return result
718. 最长重复子数组
dp含义:dp[i][j]表示以i-1,j-1为结尾的最长重复子数组的长度,最后结果要求所有数的最大值(子序列问题通用)
tips:
用二维数组记下状态
动态规划的实质,状态转移,下一个状态只跟上一个状态有关,如果记录状态是重点,即dp数组的构造和含义
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
# initialization
dp = [[0]*(len(nums2)+1) for _ in range(len(nums1)+1)] # dp[i][j]表示以i-1,j-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
dp[i][-1] = max(dp[i])
# print(dp[i])
# print(dp)
result = 0
for i in range(len(nums1)+1):
result = max(result, dp[i][-1])
return result