1 条题解

  • 0
    @ 2025-11-18 16:07:49

    普通 DP 解法: 定义 dp[i]dp[i] 表示以第 i 个元素结尾的最长上升子序列长度。

    初始化 dp[i]=1dp[i] = 1

    若存在 j<ij < iaj<aia_j < a_i,则有:dp[i]=max(dp[i],dp[j]+1)dp[i] = max(dp[i], dp[j] + 1)

    答案即为 max(dp[i])max(dp[i])

    但此算法为 O(2n)O(2^n),在 n=1000000n = 1000000 时会超时。

    贪心 + 二分优化: 维护一个数组 tailtail,其中 tail[k]tail[k] 表示长度为 k+1k+1 的上升子序列的最小结尾值。

    对于每个高度 xx

    x>tail[1]x > tail[−1],说明可以延长子序列,将 xx 追加;

    否则用二分查找第一个 x≥x 的位置,用 xx 替换该值。

    最后 tailtail 的长度即为 LISLIS 长度。

    这种方法并不真正记录序列,但可保证长度最优。

    时间复杂度:O(n)O(n)

    • 1

    信息

    ID
    7
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    14
    已通过
    8
    上传者