DP问题——最长上升子序列

https://zhuanlan.zhihu.com/p/46154210

1.题目描述

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例

输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。

2.题目分析

状态转移方程

一道很明显的动态规划问题,首先分析状态转移方程。位置i所组成的最长上升子序列长度为在它之前比它的所有数字的最长上升子序列长度集合的最大值

dp[i] = 1 + max(dp[n] 0 < n < i if nums[i] > nums[n])

初始条件

dp[0] = 1

第一个数字的最长上升子序列长度为1

 

代码

def length_of_lis():

    box_num = int(input())
    box_high = input().strip().split()
    box_high = [int(i) for i in box_high]
    print(box_high)

    if box_num == 0:
        return 0
    if box_num == 1:
        return 1

    dp = [0]*box_num
    dp[0] = 1

    for i in range(1, box_num):
        maxlen = 0
        for j in range(i):
            if box_high[i] > box_high[j]:
                if maxlen < dp[j]:
                    maxlen = dp[j]
        dp[i] = maxlen + 1

    print(dp)
    return max(dp)

 

你可能感兴趣的:(剑指offer)