最長上公升子串行O nlogn

2021-07-06 08:19:48 字數 705 閱讀 8678

假設已經計算出的兩個狀態a和b滿足a[a] < a[b]且d[a] = d[b],則對於後續所有的狀態i(即i > a且i > b)來說,a並不會比b差——如果b滿足a[b] < a[i]的條件,a肯定也滿足,且二者的d值相同;但反過來卻不一定了,a滿足a[a] < a[i]的條件時,b卻不一定滿足。換句話說,如果我們只保留a,一定不會丟失最優解。

這樣,對於相同的d值,只需保留a最小的乙個。設g[i]表示d值為i的最小狀態編號(如果不存在,g[i]定義為無窮大inf)。根據上述定理可以證明:

g[1] <= g[2] <= g[3] <= …… <= g[n]

注意上述g的值是動態改變的。對於乙個給定的狀態i,我們只考慮在之前已經計算過的狀態j(即j < i),上述g序列也是基於這些狀態的,隨著i的不斷增大,要考慮的狀態越來越多,g也隨之發生變化。在給定狀態i時,可以用二分查詢得到滿足g[k] >= a[i]的第乙個下標k,則d[i]=k,此時a[i] < g[k],而d[i]=k,所以更新g[k]=a[i]。

#include

#include

#include

using

namespace

std;

#define inf 1000000

int main()

for(int i=0;icout

<}

最長上公升子串行 O nlogn

題目描述 input 輸入乙個整數n 表示接下來有 n 個數輸入。output 輸出當前數列最長上公升子串行的長度。直接上 最長下降子串行 最長山峰序列都可以以該問題為母問題 進行延伸。include include using namespace std define max 1000 int s...

最長上公升子串行O nlogn

令a i 表示輸入第i個元素,d i 表示從a 1 到a i 中以a i 結尾的最長子序列長度。對於任意的0 j i 1,如果a j a i 則a i 可以接在a j 後面形成乙個以a i 結尾的新的最長上公升子串行。對於所有的 0 j i 1,我們需要找出其中的最大值。dp狀態轉移方程 d i m...

最長上公升子串行O nlogn

最近在做單調佇列,發現了最長上公升子串行o nlogn 的求法也有利用單調佇列的思想。最長遞增子串行問題 在一列數中尋找一些數,這些數滿足 任意兩個數a i 和a j 若i 設dp i 表示以i為結尾的最長遞增子串行的長度,則狀態轉移方程為 dp i max,1 j 這樣簡單的複雜度為o n 2 其...