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

2022-05-14 07:10:00 字數 1575 閱讀 7684

題目描述description

熊大媽的奶牛在小沐沐的薰陶下開始研究資訊題目。小沐沐先讓奶牛研究了最長上公升子串行,再讓他們研究了最長公共子串行,現在又讓他們要研究最長公共上公升子串行了。

小沐沐說,對於兩個串a,b,如果它們都包含一段位置不一定連續的數字,且數字是嚴格遞增的,那麼稱這一段數字是兩個串的公共上公升子串,而所有的公共上公升子串中最長的就是最長公共上公升子串了。

奶牛半懂不懂,小沐沐要你來告訴奶牛什麼是最長公共上公升子串。不過,只要告訴奶牛它的長度就可以了。

輸入描述input description

第一行n,表示a,b的長度。

第二行,串a。

第三行,串b。

輸出描述output description

輸出長度。

樣例輸入sample input

42 2 1 3

2 1 2 3

樣例輸出sample output

2資料範圍及提示data size & hint

1<=n<=3000,a,b中的數字不超過maxlongint

/*

首先是n^3的做法,f[i][j]表示以a串的前i個整數與b串的前j個整數且以b[j]為結尾構成的lcis的長度。轉移就很好想了。

*/#include

#include

#define n 3010

using

namespace

std;

inta[n],b[n],f[n][n],n;

intmain()

f[i][j]=max(f[i][j],maxn+1

); }

}int ans=0

;

for(int i=1;i<=n;i++)ans=max(ans,f[n][i]);

printf("%d

",ans);

return0;

}

/*

然後是n^2的做法,考慮優化n^3。我們可以考慮省去第三重迴圈,因為每次取的都是最大值,所以可以維護乙個最大值,可以用乙個陣列維護。但是題解給出了更好的方法:因為只有b[k]*/

#include

#include

#define n 3010

using

namespace

std;

inta[n],b[n],f[n][n],n;

intmain()

}int ans=0

;

for(int i=1;i<=n;i++)ans=max(ans,f[n][i]);

printf("%d

",ans);

return0;

}

最長公共上公升子串行

題目描述 給定兩個整數序列,求它們的最長上公升公共子串行。輸入描述 輸入兩組資料,每組資料代表乙個整數序列,其輸入格式為 第一行輸入長度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...