# 最长上升子序列
"""
给你一个整数数组 nums,找到其中最长严格递增子序列的长度。
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。
例如 [3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
"""
class Solution:
def lengthOfLIS(self, nums) -> int:
dp = [0 for i in range(len(nums))] # 肯定需要一个当前位置连续递增的数量列表
# [1, 1, 1, 2, 2, 3, 4, 4] print(dp)
for i in range(len(nums)): # 循环所有
dp[i] = 1 # 对应状态设为1(因为自己本身也算一个递增)
for j in range(i): # 那么就是循环i前面的区间
if nums[j] < nums[i]: # 如果有nums[i]小的 说明在对应的dp[j]的位置值加1 保存
dp[i] = max(dp[i], dp[j] + 1)
# 注意拿dp[i]和dp[j]+1比较是为了防止 最大的如果已经保存到dp[i]的话 那么小的就不需要了
return max(dp)
"""
小tips
a[:] # 如果取不出来值就为空
a[n] # 如果n超界就会报错
for i in range(0): 是不会循环的 也不会报错
"""
nums = [10, 9, 2, 5, 3, 7, 101, 18]
a = Solution()
print(a.lengthOfLIS(nums))
最长上升子序列(LIS),动态规划模板题,不是很难