定义子问题的递归求解方式:f(n) = max(f(i)) + 1 , i < n, a[i] < a[n]。
依次求解子问题,并保存结果。
合并子问题的解,得到最优解。
classSolution:def__init__(self):
self.ans =[]deff(self,i,nums):# 求解子问题的递归函数if i ==0:# 终止条件return1iflen(self.ans)> i:# 记忆return self.ans[i]
res =1# 之前没有比a[i]小的元素时,结果为1for j inrange(i):if nums[j]< nums[i]:
res =max(res, self.f(j,nums)+1)return res
deflengthOfLIS(self, nums: List[int])->int:iflen(nums)==0:return0for i inrange(len(nums)):# 计算每个子问题,并保存结果
self.ans.append(self.f(i,nums))returnmax(self.ans)# 合并子问题的解,得到最优解
classSolution:deflengthOfLIS(self, nums: List[int])->int:ifnot nums:return0
dp =[0]*len(nums)
dp[0]=1for i inrange(1,len(nums)):
sub =[x for idx, x inenumerate(dp)if nums[idx]<nums[i]]if sub:
dp[i]=max(sub)+1else:
dp[i]=1returnmax(dp)