最長遞增子串行(LIS)

2021-09-12 19:19:24 字數 495 閱讀 2884

最長遞增子串行定義描述看這裡

有序列,我們求其最長遞增子串行,按照遞推求解的方式。若用f[n]代表代表這個以an結尾的最長遞增子串行。

則最自然考慮的就是n-1的最長子序列。若an比的任何乙個都小,則將這個序列的最長遞增子串行變為1,an大於ai及其之前的所有元素,則an可以加在這個最長子序列的最後。

例如a=[2, 5, 3], 當它的下乙個元素是1的時候, 該如何拓展當前序列[2, 5]/[2, 3]呢? 顯然1不能拓展兩者中的任何乙個. 因為1有可能是乙個新的lis序列的最小的元素. 例如a=[2, 5, 3, 1, 2, 3, 4, 5, 6]的時候, 1就是lis([1, 2, 3, 4, 5, 6])的最小元素.

通過以上的觀察, 在迴圈中, 我們需要維護乙個遞增序列的列表.

通常情況下, 我們有乙個變長列表的集合. 這些變長列表按照長度遞增的順序排列. 然後我們將陣列元素a[i]新增到這些列表中. 然後逆序搜尋集合中這些列表的末尾元素. 從而找到第乙個末尾元素小於a[i]的列表.

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