LIS 最長上公升序列(DP 二分優化)

2022-05-29 21:09:09 字數 780 閱讀 5088

求乙個數列的最長上公升序列

動態規劃法:o(n^2)

1

//dp

2int lis(int a, intn)3

16}17}

18return cnt+1;//

因為初始化為0,所以返回結果+1

19 }

貪心+二分法:o(nlogn) 

分析:要讓乙個序列具有最長上公升子串行,其實就是保證子串行中的每個元素盡可能小,降低門檻,讓後面的元素盡可能多進入該子串行

實現:定義乙個最長子序列陣列array,以及當前長度len,從頭到尾維護陣列a

a. a[i]>array[i] (當前元素大於子串行結尾元素),則a[i]進入子串行:array[++len] = a[i]

b. a[i]<=array[i],這時對array進行維護,把array中比a[i]大的第乙個元素替換成a[i](這樣可以降低後面元素進入子串行的門檻。

c. 為了降低演算法複雜度,因為array是公升序序列,所以用lower_bound查詢array中第乙個大於等於a[i]的元素

1

//貪心+二分

2int lis(inta)3

16}17return cnt+1

;18 }

求最長下降子串行:

不需要再寫lds---直接將要求的陣列倒序,倒序陣列的最長上公升子串行長度=原陣列最長下降子串行長度。

LIS 最長上公升子串行 dp 二分優化

建立乙個陣列res maxn res i 用來記錄以i位置為結尾的最長的子串行,那麼我們要求res這個陣列裡的最大值 注意不是res n 所以當我們在求res i 時,需要從0到i 1掃一遍,看看通過哪個點 鬆弛 因為這個演算法好像迪科斯徹最短路,所以借用這個名詞來解釋一下 這樣 如下 includ...

LIS 最長上公升子串行 (二分優化)

題目 長度為n的序列a1,a2,an,選出滿足 j i 時,a j a i 最長子序列 分析 當選擇第i個時候,在j狀態 dp i 表示以i為終點的最大上公升序列 轉移方程 dp i max include include include include include include includ...

1081 最長上公升子串行 (dp 二分)

pipi又來考大家最長上公升子串行問題了 不過這次它想為難一下你 給你乙個整數序列,包含n個整數,要你求最長上公升子串行的長度 多組輸入 第一行為乙個整數n,1 n 1000000 第二行包括n個整數,每個整數均在int範圍內 輸出乙個整數,表示最長上公升子串行的長度。51 2 5 4 7 incl...