最長上升子序列LIS算法
$\Theta(n^2)$數組
$f_i=max(f_j+1),j<i,a_j<a_i$優化
$\Theta(nlogn)$指針
限制條件二維偏序,bit優化it
求方案數:方法
1.$\Theta(nlogn)$im
樹狀數組維護二元組$(f_i,g_i)$分別表示長度、方案數,按照最顯然的更新方法更新就行。數據
樹狀數組一直不太懂,不敢亂搞。實際上樹狀數組上的一個位置i維護的是$[i-lowbit(i)+1,i]$的區間最大f和對應的$\sum\limits_{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]]=\sum\limits_{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\neq 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。