最长上升子序列(动态规划)--算法学习
发布日期:2021-05-15 00:27:55 浏览次数:12 分类:精选文章

本文共 846 字,大约阅读时间需要 2 分钟。

为了解决这个问题,我们需要找到给定序列的最长上升子序列的长度。上升子序列是指从原序列中选择一些元素,保持顺序,使得每个元素都比前一个大。

方法思路

我们可以使用动态规划的方法来解决这个问题。对于每一个位置 i,我们记录以 a[i] 为终点的最长上升子序列的长度。初始化时,每个位置的长度都设为1,因为每个元素本身就是一个长度为1的子序列。

具体步骤如下:

  • 初始化一个数组 max_len,其中 max_len[i] 表示以 a[i] 为终点的最长上升子序列的长度。
  • 遍历序列中的每一个元素 a[i],对于每个 i,检查它前面所有 j 的位置(j < i),如果 a[j] < a[i],则更新 max_len[i]max(max_len[j] + 1)
  • 最终,max_len 数组的最后一个元素即为最长上升子序列的长度。
  • 解决代码

    n = int(input())a = list(map(int, input().split()))max_len = [1] * nfor i in range(n):    for j in range(i):        if a[j] < a[i]:            if max_len[j] + 1 > max_len[i]:                max_len[i] = max_len[j] + 1print(max_len[-1])

    代码解释

  • 读取输入:首先读取序列的长度 n 和序列 a
  • 初始化数组:创建一个 max_len 数组,初始值为1,因为每个元素本身都是一个长度为1的子序列。
  • 动态规划计算:对于每个位置 i,遍历其前面的每个位置 j,如果 a[j] < a[i],则更新 max_len[i]max(max_len[j] + 1)
  • 输出结果:最后,max_len 数组的最后一个元素即为最长上升子序列的长度。
  • 这种方法的时间复杂度为 O(N^2),在处理长度为 1000 的序列时是可行的。

    上一篇:最长公共子序列(动态规划)--算法学习
    下一篇:动规解题的一般思路--算法学习

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月30日 01时52分20秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章