LIS最長遞增子串行DPC 實現

2021-06-18 10:47:27 字數 560 閱讀 1622

設f(i)表示l中以

ai為末元素的最長遞增子串行的長度。則有如下的遞推方程:

這個遞推方程的意思是,在求以ai

為末元素的最長遞增子串行時,找到所有序號在l前面且小於ai

的元素aj

,即jaj

i。如果這樣的元素存在,那麼對所有aj

,都有乙個以aj

為末元素的最長遞增子串行的長度f(j),把其中最大的f(j)選出來,那麼f(i)就等於最大的f(j)加上1,即以ai

為末元素的最長遞增子串行,等於以使f(j)最大的那個aj

為末元素的遞增子串行最末再加上ai

;如果這樣的元素不存在,那麼ai

自身構成乙個長度為1的以ai

為末元素的遞增子串行。

#include #define maxn 10000

using namespace std;

void lis(int l,int n)

}delete f;

cout << f[n-1];

}int main()

最長遞增子串行 LIS

對於這個問題,最直觀的dp方法是cnt i 表示以height i 結束的最長遞增子串行的元素的個數,遞迴方程是cnt i max for max i 0 i求出整個數列的最長遞增子串行的長度 if b i max max b i cout return 0 顯然,這種方法的時間複雜度仍為o n 2...

最長遞增子串行 LIS

給定乙個長度為n的陣列,找出乙個最長的單調自增子序列 不一定連續,但是順序不能亂 例如 給定乙個長度為6的陣列a,則其最長的單調遞增子串行為,長度為4.這個問題可以轉換為最長公共子串行問題。如例子中的陣列a,則我們排序該陣列得到陣列a 然後找出陣列a和a 的最長公共子串行即可。顯然這裡最長公共子串行...

最長遞增子串行(LIS)

300.longest increasing subsequence good 給定乙個長度為n的陣列,找出乙個最長的單調遞增子串行 不一定連續,當時先後順序不能亂 更正式的定義是 設l 是n個不同的實數的序列,l的遞增子串行是這樣乙個子串行lin 其中k1。比如陣列a 為,那麼最長遞增子串行為。以...