动态规划——最长上升子序列

Posted coding易码当先

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划——最长上升子序列相关的知识,希望对你有一定的参考价值。

1. 题目描述

        给定N个数,求这N个数的最长上升子序列的长度。


2. 问题分析

  • 什么是最长上升子序列?
    给出一个样例,如图所示。[2,3,4,7] 和 [2,3,4,6] 就是序列 [2,5,3,4,1,7,6] 的两个最长上升子序列。最长的长度是4.

    

  • 如何求最长上升子序列?
    假设以第 n 个数字结尾的子序列的最长长度用 f(n) 表示,对于第 n 个数字之前的数字我们使用 i 表示,i∈(1,2,⋯,n−1)。如果第 i 个数字小于第 n 个数字,那么 f(n)=max(f(n),f(i)+1),而如果第 i 个数字大于或者等于第 n 个数字,则不能够构成以第 n 个数字结尾的上升子序列。


3. 代码实现


    有了上述的递推关系式,我们也可以使用递归实现,也可以使用动态规划实现,出于效率考虑,下面使用动态规划实现,实现代码如下:


def find_max(data, number):
    """
    求出一个序列中最长上升子序列的长度。
    :param data: 给定的序列
    :param number: 给定序列的长度
    :return: 最大长度
    """

    max_len = [1] * number

    for i in range(1, len(data)):
        for j in range(0, i):
            if data[j] < data[i]:
                max_len[i] = max(max_len[i], max_len[j] + 1)

    return max(max_len)


以上是关于动态规划——最长上升子序列的主要内容,如果未能解决你的问题,请参考以下文章

动态规划模板1|LIS最长上升子序列

线性状态动态规划 P1020 导弹拦截最长上升子序列

最长上升子序列(LIS)动态规划

动态规划最长上升子序列

动态规划最长上升子序列

300. 最长上升子序列-动态规划