leetcode【中等】300、最长上升子序列

在这里插入图片描述
思路:动态规划
dp[i]定义为,到第i个位置为止的,最长递增子序列,每遍历到一个i,就用j0遍历到i-1,选出每个比i小的j,即当前数i可以接在前面哪个序列的尾巴上,计算最大长度

初始:dp都为1,每个数都是一个子序列
转移方程: dp[i] = max(dp[i], dp[j] + 1) for j in [0, i)
答案:max(dp)

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        if not nums: 
        	return 0
        dp = [1] * len(nums)
        for i in range(len(nums)):
            for j in range(i):
            	# 如果要求非严格递增,将此行 '<' 改为 '<=' 即可。
                if nums[j] < nums[i]: 
                    dp[i] = max(dp[i], dp[j] + 1)
        return max(dp)

猜你喜欢

转载自blog.csdn.net/qq_40707462/article/details/113352584