7-25 最长上升子序列
发布日期:2021-05-10 23:56:03 浏览次数:29 分类:精选文章

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

为了解决这个问题,我们需要找到给定序列中的最长上升子序列的长度。上升子序列是指一个序列中的元素严格递增。

方法思路

我们可以使用二分查找来高效地解决这个问题。具体步骤如下:

  • 初始化一个空数组 tail,用于记录当前最长上升子序列的末端值。
  • 遍历序列中的每个元素 num
    • 使用二分查找找到 numtail 中的插入位置 pos
    • 如果 pos 等于 tail 的长度,说明 num 比所有当前末端值大,直接将 num 添加到 tail 的末尾。
    • 否则,将 tail 中位置 pos 的元素替换为 num
  • 最终tail 的长度即为最长上升子序列的长度。
  • 这种方法的时间复杂度为 O(n log n),能够高效处理较大的输入规模。

    解决代码

    import bisect
    n = int(input())
    a = list(map(int, input().split()))
    tail = []
    for num in a:
    pos = bisect.bisect_right(tail, num)
    if pos == len(tail):
    tail.append(num)
    else:
    tail[pos] = num
    print(len(tail))

    代码解释

  • 读取输入:首先读取输入的序列长度 n 和序列 a
  • 初始化 tail 数组:用于记录最长上升子序列的末端值。
  • 遍历每个元素:对于序列中的每个元素 num,使用 bisect.bisect_right 方法找到其在 tail 中的插入位置 pos
  • 更新 tail 数组:根据插入位置 pos 更新 tail,使得 tail 中始终保持最长上升子序列的末端值。
  • 输出结果:最终 tail 的长度即为最长上升子序列的长度。
  • 这种方法利用二分查找优化了时间复杂度,能够在较短时间内处理大规模输入,确保了算法的高效性。

    上一篇:7-26 最长公共子序列
    下一篇:7-24 矩阵连乘问题

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月08日 14时07分12秒