最长上升子序列(一),动态规划
当前的元素,只有与之前的某个元素相接时才能组成最长上升子序列。只要之前元素比当前元素小,就可以相接,但最终与谁相接,则要看以谁结尾的上升子序列最长。相接即状态转移,若以元素i结尾的最长上升子序列长度为状态dp[i],则它可能与之前i-1个状态相关,需遍历取满足条件的最大者作为其前一个状态。
class Solution: def LIS(self , arr: List[int]) -> int: if not arr: return 0 dp = [1]*len(arr) # 长度至少为1,故初始为1,dp[i]表示以arr[i]结尾的最长上升子序列 max_len = 0 # 维护最长值 for i in range(len(arr)): j = i tmp = 0 while j >= 0: # 往前找尾部值比arr[i]小的最长上升子序列 if arr[i] > arr[j]: tmp = max(tmp, dp[j]) j -= 1 dp[i] += tmp # 初始值1,加上之前的最长长度 max_len = max(max_len, dp[i]) return max_len