今天做題做到\(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,如果它們都包含一段位置不一定連續的數,且數值是嚴格遞增的,那麼稱這一段數是兩個數列的公共上公升子串行,而所有的公...