1 条题解

  • 0
    @ 2026-8-28 1:20:30

    题解

    思路推导

    设美丽子序列的最后一个元素来自原序列下标 ii。如果此前一个元素来自下标 jj,那么必须同时满足 j∣ij\mid i 与 aj<aia_j<a_i。因此可以把问题写成按下标递增的动态规划。

    直接对每个 ii 枚举全部 j<ij<i 可以得到二次算法。为了处理完整范围,改为从一个下标 jj 出发枚举 2j,3j,…2j,3j,\ldots。这样只访问真正满足位置整除条件的下标对,再根据值的大小决定是否转移。

    做法

    令 fif_i 表示以 aia_i 结尾的最长美丽子序列长度,初值均为 11。按 i=1,2,…,ni=1,2,\ldots,n 的顺序处理,并枚举 ii 的所有更大倍数 jj。若 ai<aja_i<a_j,就用 fi+1f_i+1 更新 fjf_j。

    由于所有转移都从较小下标指向较大下标,处理到 ii 时 fif_i 已经确定。最终答案是所有 fif_i 的最大值。

    正确性证明

    任意以 jj 结尾且长度大于 11 的美丽子序列,其倒数第二个元素位于某个下标 i<ji<j,并满足 i∣ji\mid j 与 ai<aja_i<a_j。算法处理 ii 时会枚举到倍数 jj,从而用对应最优状态更新 fjf_j,所以不会漏掉任何合法子序列。

    反过来,算法执行的每次转移都满足位置整除和值严格递增。把 aja_j 接到取得 fif_i 的美丽子序列后仍然合法,因此算法产生的每个状态都能由真实美丽子序列达到。两方面结合,所有 fif_i 均为准确最优值,最大者即为答案。

    复杂度分析

    倍数枚举次数为 ∑i=1n⌊n/i⌋=O(nlog⁡n)\sum_{i=1}^{n}\lfloor n/i\rfloor=O(n\log n)。时间复杂度为 O(nlog⁡n)O(n\log n),空间复杂度为 O(n)O(n)。

    • 1

    信息

    ID
    1058
    时间
    3000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    0
    上传者