问题:
题目来源:力扣(LeetCode)
难度:简单
分析:
经典题。
一、动态规划
观察数组,要求数组的最长上升子序列,可以想到长度为i的子序列可以由长度为i - 1的递推而来,因此考虑动态规划。那么动态规划的状态空间该如何定义呢?
思考最长上升子序列的寻找过程,当我们遍历到数组的i位置时,无法判断最终的最长子序列是由i结尾的所属的子序列还组成还是由i - 1结尾或者其他的子序列组成。因此我们需要把位置i之前的所有位置所在的子序列的长度都记录下来。
因此我们这样定义状态空间,dp[i]代表的是以nums[i]结尾的子序列的最长子序列的长度。
递推公式为:dp[i] = max(dp[i][, dp[j] + 1) if nums[i] > nums [j]
最后取以每个元素结尾的子序列长度的最大值。
解决方法:
1:动态规划
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int: