LIS LCS LCIS

最長上升子序列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。

相關文章
相關標籤/搜索