最長公共上公升子串行 LCIS

2022-02-24 16:53:34 字數 1318 閱讀 8713

今天做題做到\(lcis\)的題目,然後不知道為啥走神連帶看知乎最後乙個半小時才搞懂

所以講\(lcis\)之前也說說\(lcs \& lis\)

\(lis\)又名最長上公升子串行,就是讓你求最長上公升的序列。

話不多說,直接上**吧,反正不是重點。這裡主要講的是二分查詢優化

for(int i=2; i<=n; i++)

int l=0,r=len;

while(l<=r)

f[l]=p;

}

其實c++裡面還有乙個黑科技函式叫做\(lower\_bound\),你要是不寫二分查詢可以用一下這個函式,挺實用的。

\(lcs\)又名最長公共子串行,複雜度如果不是特定題目的話普遍為\(nm\),因為他需要遍歷兩個陣列。

設方程\(dp[i][j]\)表示\(a\)到\(i\),\(b\)到\(j\)的序列時的最長長度,因此,\(dp\)方程顯而易見的就求出來了

\[dp[i][j]=

\begin

\max(dp[i-1][j],\,dp[i][j-1])\\

dp[i-1][j-1],\,(a[i]=b[j])\\

\end

\]然後就是**

for(int i=1; i<=n; i++)

for(int j=1; j<=n; j++)

這才是今天要講的重點

首先設乙個方程\(dp[i][j]\)表示\(a\)以\(i\)結尾,\(b\)以\(j\)結尾並且末尾一定是\(b_j\)的公共子串行。

首先就是轉移方程\(dp[i][j]=dp[i-1][j]\),為啥呢。

因為這是以\(b_j\)結尾的,所以它需要從上一維中獲得狀態轉移。

然後就是分兩種情況,一種是\(a[i]=b[j]\),另一種\(a[i]>b[j]\)。

如果\(a[i]>b[j]\),那肯定存在乙個\(a_1 \cdots a_k\)中必定有乙個小於\(b_j\),所以我們就用乙個變數維護小於\(b_j\)的最長長度。

如果\(a[i]==b[j]\),那麼存在兩種選擇,選還是不選?

如果選,那麼\(dp[i][j]=mx+1\),如果不選,那就是原值。所以方程為\(dp[i][j]=max(dp[i][j],mx+1)\)。

LCIS 最長公共上公升子串行

1004 tyvj1071 lcis最長公共上公升子串行 description 熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們要研究最長公共上公升子串行了。小沐沐說,對於兩個串a,b,如果它們都包含一段位置不一定連續的...

LCIS (最長公共上公升子串行)

ac通道 題目含義就是求最長公共上公升子串行 首先考慮,最長公共上公升子串行 最長上公升子串行 最長公共子串行,可以通過lis和lcs的思想去考慮本題目。定義狀態 dp i j 表示a陣列的前i個和b陣列的前j個且以b j 結尾的lcis長度考慮狀態轉移 轉移有兩種情況 a i b j 時候的轉移,...

最長公共上公升子串行(LCIS)

題解熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們研究最長公共上公升子串行了。小沐沐說,對於兩個數列a和b,如果它們都包含一段位置不一定連續的數,且數值是嚴格遞增的,那麼稱這一段數是兩個數列的公共上公升子串行,而所有的公...