1 条题解

  • 0
    @ 2024-4-4 14:17:50

    最长不下降子序列题解

    备注:AA表示长度为nn的序列。

    普通动态规划

    fif_i表示以AiA_i为结尾的最长不下降子序列的长度,那么每次枚举fif_i时,我们都要寻找AiA_i前面接的数字,并使接上这个数字后最长不下降的子序列的长度最大。所以我们要枚举jj,并且jj满足AjAi,j<iA_j\le A_i,j<ifif_i就等于符合条件且最大的fj+1f_j+1
    时间复杂度为O(n2)O(n^2),会超时。

    正解动态规划

    fif_i表示长度为ii的不下降子序列的最后一个数的最小值,maxnmaxn表示最长不下降子序列的长度,那么输入AiA_i时有以下情况:

    1.Ai>fmaxn1.A_i>f_{maxn}

    这时最长不下降子序列的长度将增加11,而新的最长不下降子序列的最后一个数的最小值将是AiA_i

    2.2.除上述情况以外

    AiA_i有可能是长度为xx的不下降子序列的最后一个数的最小值,因此用二分查找找到满足 fx<Ai,fx+1Aif_x<A_i,f_{x+1}\ge A_ixx,并将fxf_x替换为AiA_i。如果不这么做,后面输入的Ai+1A_{i+1}有可能小于原来的fxf_x,大于AiA_i,此时不下降子序列的长度可增加11,但由于fxf_x未更新,所以程序不会这么做,这时答案会错误。

    时间复杂度为O(nlogn)O(n\log n)

    信息

    ID
    41
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    3
    已通过
    1
    上传者