📜  最长递增子序列的Python程序(1)

📅  最后修改于: 2023-12-03 15:40:17.467000             🧑  作者: Mango

最长递增子序列的Python程序介绍

简介

最长递增子序列(Longest Increasing Subsequence,LIS)指的是在一个无序的数列中,找到一个子序列(可以不连续),使得这个子序列的元素在原序列中的下标是递增的,且这个子序列的长度是所有满足递增条件的子序列中最长的。

LIS 是一个经典的算法问题,它有多种解法。在本篇文章中,我们将介绍使用动态规划算法求解 LIS 的 Python 程序。

动态规划解法

具体来说,我们可以使用动态规划的思想来解决 LIS 问题。假设我们已经求出了原序列前 i-1 个元素的 LIS,如何求出前 i 个元素的 LIS 呢?我们只需要枚举 i 前面的元素 j,如果第 j 个元素小于第 i 个元素,那么 这个 j 元素的 LIS 长度就可以加上 1,从中选出最大的即可。

使用状态转移方程来表示上述算法的思路,即:

LIS[i] = max(LIS[j])+1, j<i且a[j]<a[i]

其中,LIS[i] 表示以第 i 个元素结尾的最长递增子序列的长度。

程序代码

下面是使用动态规划算法求解 LIS 的 Python 程序:

def lis(nums):
    n = len(nums)
    dp = [1] * n
    for i in range(1, n):
        for j in range(i):
            if nums[j] < nums[i]:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)

其中,nums 表示原序列,dp 表示以第 i 个元素结尾的最长递增子序列的长度。该算法的时间复杂度为 O(n^2)。

示例

下面是一个简单的示例,展示如何使用该 Python 程序求解 LIS:

# 示例
nums = [10, 9, 2, 5, 3, 7, 101, 18]
print(lis(nums))

输出结果为:

4

这个结果表示,在原序列 [10, 9, 2, 5, 3, 7, 101, 18] 中,最长递增子序列的长度为 4。其中,一个符合条件的子序列是 [2, 3, 7, 101]