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

2021-08-05 20:19:48 字數 827 閱讀 5887

題目:

我是超連結

題解:講解

最開始的狀態:f[i][j]表示a陣列的第i項和b陣列的第j項結尾為b[j]的最大長度,轉移:f[i][j]=f[i-1][j]   (a[i]!=b[j])max   (a[i]==b[j],i<=kb[k])

這樣的效率是n^3的,列舉最大值的迴圈怎麼看都可以去掉,我們可以優化:觀察第二個式子,發現a[i]>b[k]的時候起作用,那我們可以在遍歷第二個陣列的時候「順便」把比a[i]小的b[j]的f取乙個最大值,這樣就不用列舉最大值了 

n^2是合格了,空間可不可以更優呢?發現f只和上乙個有關,可以運用滾動陣列,也可以直接去掉了啊

**:不用輸出例子的:

#include #include using namespace std;

int a[3005],b[3005],f[3005];

int main()

}for (i=1;i<=n;i++) maxx=max(maxx,f[i]);

printf("%d",maxx);

}

需要輸出例子的

#include #include #include #define inf 1e9

using namespace std;

struct nod

f[505];

int a[505],b[505];

int main()

一般字串的dp設計狀態都是f[i][j]表示a串匹配到i,b串匹配到j,列舉匹配好的長度,帶權什麼的初值就不要賦成inf

最長公共上公升子串行

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

最長公共上公升子串行

首先,在 a i b j 的時候有 dp i j dp i 1 j 為什麼呢?因為 dp i j 是以b j 為結尾的 lcia 如果dp i j 0 那麼就說明 a 1 a i 中必然有乙個字元 a k 等於b j 如果dp i j 等於0 呢?那賦值與否都沒有什麼影響了 因為 a k a i 那...

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

題目 common subsequence 題目描述 給定兩個字串a和b 或數字序列 求乙個字串,使得這個字串是所給兩個字串的最長公共部分 可以不連續 動態規劃的做法 時間複雜度,o n m include include include include using namespace std co...