給定乙個長度為 \(n\) 的序列 \(a\),乙個長度為 \(m\) 的序列 \(b\),求他們的最長的公共上公升子串行的長度。
考慮狀態設定為最長公共子串行和最長上公升子串行的狀態"合併"在一起的狀態。
設 \(f[i][j]\) 為 \(a\) 前 \(i\) 個和 \(b\) 前 \(j\) 個匹配的最長公共上公升子串行以 \(b[j]\) 結尾的長度。(其實這裡設定成 \(a[i]\) 結尾也可以,只不過為了後面好轉移設的是 \(b[j]\))
轉移方程就很好推了:
\[f[i][j]=\max\beginf[i-1][j]\ \ (a[i]\neq b[j])\\ \max\(n^3)\) 的,考慮優化:
首先因為 \(a[i]==b[j]\),所以裡面那個 \(\max\) 可以寫成這個形式
\[\max\(n^2)\) 更新。
具體地:如果列舉到的 \(b[j],則為後面的 \(j\) 更新 \(\max\(n)\)。
#include#includeinline int max(int x, int y)
inline int read()
while(ch >= '0' && ch <= '9')
return w ? ~r + 1 : r;
}const int n = 3010;
int n, m, ans;
int a[n], b[n], f[2][n];
signed main()
} for(int i = 1; i <= m; ++i)
ans = max(ans, f[n&1][i]);
printf("%d\n", ans);
return 0;
}
後兩道題還需要再記錄路徑,這部分的思考留給讀者。 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,如果它們都包含一段位置不一定連續的數,且數值是嚴格遞增的,那麼稱這一段數是兩個數列的公共上公升子串行,而所有的公...