动态规划:最长上升子序

95 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

题目描述

给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。

子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。

输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为 4

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

首先每个数字的长度为1 那么先建立一个状态列表 以 【10,9,2,5,3,7,101,18】为例, 那么它一开始的状态列表为【1 】* len(nums) 然后开始找规律 【10】 状态列表:【1】 即,10对应长度1的上升序列

【10,9】 状态列表:【1,1】

【10,9,2】 状态列表:【1,1,1】

【10,9,2,5】 状态列表:【1,1,1,2】

【10,9,2,5,3】 状态列表:【1,1,1,2,2】

然后我们找到的规律如下: 以5为例,它比10,9都要小,所以它的上升子序长度为1,但5又比2要大,所以它的上升子序长度为2(2对应的最长子序列状态加1)

然后我们将这个规律写成代码

代码实现

nums1 = input().split()

length = len(nums1)
nums = []

for i in range(length):
    x = int(nums1[i])
    nums.append(x)

l = len(nums)

result = [1] * l

for i in range(l):
    for j in range(i):
        if nums[i] > nums[j]:
            result[i] = max(result[i], result[j] + 1)

print(max(result))