LIS最長遞增子串行

2022-09-20 03:57:07 字數 689 閱讀 1676

給定乙個長度為n的陣列,找出乙個最長的單調遞增子串行。

例如:給定陣列a,則其最長的單調遞增子串行為,長度為4。

一種思路是將其轉換成lcs問題:將a陣列排序後:a'

因為,原陣列a的子串行順序保持不變,而且排序後a'本身就是遞增的,這樣,就保證了兩序列的最長公共子串行的遞增特性。如此,若想求陣列a的最長遞增子串行,其實就是求陣列a與它的排序陣列a『的最長公共子串行。

此外,本題可以直接使用動態規劃求解。

演算法如下:

設長度為n的陣列為,則 假定以aj結尾的陣列序列的最長遞增子串行 長度為l(j),則l(j)= 12

for(int i = 1; i < m; ++i) 13

20}

21} 22

int max = 1;

23for(int i = 0; i < m; ++i) 24

29}

30return

max; 31

} 3233

int main(int argc, const

char *ar**) 34

; 36int max = lislength(a, 6);

37 cout << max

39 }

注意if判斷條件,前一位小於i位,並且i位結尾的最長序列小於前一位最長序列+1,迴圈就一直進行下去。

最長遞增子串行 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 為,那麼最長遞增子串行為。以...