CodeVS2185 最長公共上公升子串行

2021-07-23 23:12:35 字數 821 閱讀 2977

令f[i][j]表示不強制選擇a[i]且強制選擇b[j]的答案。

之所以這麼設定,經過了一番考慮。如果你讓f[i][j]表示a[i]和b[j]都不強制選,那麼你無法確定答案所對應的結果中a[i]或者b[j]是否已經匹配,轉移似乎就比較比較難想;如果讓f[i][j]表示兩者都強制選,那麼二者不匹配時你就把答案設為負無窮,如果匹配,你要列舉前面哪兩個匹配,這樣時間複雜度太高。於是我們就讓乙個不強制選擇,乙個強制選擇。就出來了狀態轉移方程:

當a[i]==b[j]時,f[i][j]=f[i-1][k],其中k小於j且滿足b[k]

那麼框架出來了,列舉i、列舉j,當a[i]==b[j]時還要列舉k。這樣的話時間複雜度為o(n^3)

怎麼優化?頭疼了半天,後來看了一篇題解就懂了。

我們暫且先不考慮i這一維,i定住不動,也就是a[i]不變,要計算所有的j∈[1,n]的f[i][j]。當a[i]==b[j]時,就要列舉f[i-1][k],需滿足b[k]

思想:這裡的優化中,打擂台求最小其實沒啥,最有用的乙個思想就是把大的維度定住不動,只考慮低維度,這樣就能把高維問題轉化為低維問題,大大降低了思維複雜度。這貌似是所有dp優化中共用的思想吧? ps

:這道題如果規定匹配的區間,能否用單調佇列做呢?

#include #include #define maxn 3010

using namespace std;

int f[maxn][maxn], a[maxn], b[maxn], n;

int main()

} printf("%d\n",ans);

return 0;

}

最長公共上公升子串行(codevs 2185)

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

code 2185 最長公共上公升子串行 (dp)

時間限制 1 s 空間限制 32000 kb 題目等級 鑽石 diamond 題解 檢視執行結果 熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們要研究最長公共上公升子串行了。小沐沐說,對於兩個串a,b,如果它們都包含一段...

最長公共上公升子串行

題目描述 給定兩個整數序列,求它們的最長上公升公共子串行。輸入描述 輸入兩組資料,每組資料代表乙個整數序列,其輸入格式為 第一行輸入長度m 1 m 500 第二行輸入該序列的m個整數ai 231 ai 231 輸出描述 輸出共兩行。第一行輸出兩個序列的最長上公升公共子串行的長度l 第二行輸出該子串行...