# 子列, 不是子串# dp[i]:以i结尾的最长递增字串def LengthOfLIS(nums: [int]) -> int: dp = [1 for i in range(len(nums))] for i in range(len(nums)): for j in range(i): if nums[i] > nums[j]: # 状态转移方程 dp[i] = max(dp[i], dp[j] + 1) print(dp) return max(dp)# 朴素, dp[i]: i之前的最长递增字串def BruteLengthOfLIS(nums: [int]) -> int: max_end_of_i = [1 for i in range(len(nums))] dp = [1 for i in range(len(nums))] for i in range(len(nums)): for j in range(i): if nums[i] > nums[j]: max_end_of_i[i] = max(max_end_of_i[i], max_end_of_i[j] + 1) for i in range(1, len(nums)): dp[i] = max(dp[i - 1], max_end_of_i[i]) print(dp) return dp[-1]target = [10, 9, 2, 5, 3, 7, 101, 18]print(LengthOfLIS(target))print(BruteLengthOfLIS(target))
总结
- dp的含义不一定直接就是问题的解, 有时候dp是间接的, dp定义需要谨慎