最長公共上公升子串行的另乙個O mn 的演算法

2021-05-10 08:31:34 字數 526 閱讀 6844

我在這個帖子裡說過nlogn求最長上公升子串行的方法:

下面引用我自己的發言:

f表示長度為i的上公升子串行最後乙個數最小是多少。顯然陣列f是單增的。

讀到乙個新的數x後,找到某個i使得x>f[i]且x<=f[i+1],於是用x去更新f[i+1];特別地,如果所有的f[i]都小於x,則增加f的長度。

最後看f陣列有多長就行了。

由於f單增,所以查詢i時可以用二分查詢,因此時間複雜度為o(nlogn)。

舉個例子,假如序列為 3 2 8 6 7 4 5 7 3,則f陣列的變化過程如下: 3

22 8

2 62 6 7

2 4 7

2 4 5

2 4 5 7

2 3 5 7

最後,f的長度達到4,因此答案為4。

注意,最後的f陣列不一定是最長上公升子串行的乙個方案。

最長公共上公升子串行

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