求乙個數列的最長上公升序列
動態規劃法: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...