zoukankan      html  css  js  c++  java
  • LIS LCS LCIS

    最长上升子序列LIS

    $Theta(n^2)$

    $f_i=max(f_j+1),j<i,a_j<a_i$

    $Theta(nlogn)$

    限制条件二维偏序,bit优化

    求方案数:

    1.$Theta(nlogn)$

    树状数组维护二元组$(f_i,g_i)$分别表示长度、方案数,按照最显然的更新方法更新就行。

    树状数组一直不太懂,不敢乱搞。实际上树状数组上的一个位置i维护的是$[i-lowbit(i)+1,i]$的区间最大f和对应的$sumlimits_{k=i-lowbit(i)+1}^i g_k$,不断减去lowbit(i)可以保证收集到完整的前缀不重不漏。

    2.$Theta(n)$

    对每个f值开$vector$,按照$[1,n]$顺序加入,则每个$vector$中的$a[i]$一定是单调不增的。(反之后者f值会+1)

    升序扫描每个$vector$,设当前处理到$vec[i]$,在$vec[i-1]$中建立双指针$p1$,$p2$,对每个$vec[i][j]$,分别使其满足$j<i$和$a[j]<a[i]$的限制,由于两者都具有单调性,双指针也就是单调的。

    对于每个$vec[i][j]$,$[p2,p1]$都是它的转移点,$g[vec[i][j]]=sumlimits_{k=p2}^{p1} g[vec[i-1][k]]$,只要维护个前缀和就好了。

    然而由于f的求解需要$nlogn$,所以用哪个都无所谓了。

    最长公共子序列LCS

    $Theta(n^2)$

    $f_{i,j}=max(f_{i-1,j},f_{i,j-1},[a_i==b_j]f_{i-1,j-1}+1)$

    $Theta(nlogn)$

    可以转化为LIS:

    无重复值:把b中的值替换为a中该值出现的位置,在b上做LIS的算法二

    有重复值:把b中该值替换为a中该值出现的位置集合(降序保证每个集合只选一个),同上LIS,注意替换后序列可能很长,上限n^2。可能卡爆空间

    最长公共上升子序列LCIS

    $Theta(nm^2)$

    设$f_{i,j}$为考虑了A串的前i位,LIS的结尾在j的LCIS。注意:i为阶段

    $f_{i,j}=f_{i-1,j},a_i eq b_j \
    f_{i,j}=max(f_{i,k}+1),a_i=b_j,b_k<b_j$

    $Theta(nm)$

    j在从1扫到m时,维护$<a_i$的最优决策点。详见LYD。


    昨天晚上yy了一道题。

    求LCIS,保证A B中各自互不相同,数据范围1e5。

  • 相关阅读:
    2020/11/15助教一周小结(第十一周)
    神经网络--理解
    案例一:鸢尾花数据的分类
    TF2基础知识
    软件工程助教工作总结
    软工课程改进建议
    2020-12-27 助教一周小结(第十七周)
    2020-12-20 助教一周小结(第十六周)
    2020-12-13 助教一周小结(第十五周)
    2020-12-06 助教一周小结(第十四周)
  • 原文地址:https://www.cnblogs.com/hzoi-yzh/p/11625266.html
Copyright © 2011-2022 走看看