題目:
我是超連結
題解:講解
最開始的狀態: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...