最長遞增子串行LIS再談

2022-04-01 07:47:57 字數 1173 閱讀 2200

dp模型:

d(i) 以第 i 個元素結尾的最長遞增子串行的長度。

那麼就有 d(i) = max(d(j)) + 1;(j下面介紹乙個用二分優化的o(nlogn)的演算法。

用乙個陣列g[i] 表示 d 值為 i 的數的最小的 a;即 最長遞增子串行為 i 時,最小的 a 是多少。

顯然 g[i]<=g[2]<=g[3];

計算d[i] : 需要找到 g中大於等於a[i] 的第乙個數 j ,d[i] = j;

更新g :     g[j] = a[i] ;

使用stl的lower_bound可以直接求出比a[i] 大的第乙個數,用的二分查詢實現,總時間o(nlogn);

#include using

namespace

std;

int a[1005

];int b[1005

];int

main()

}printf(

"%d\n

",len);

return0;

}

view code

#include #include 

#include

using

namespace

std;

#define maxn 1005

#define inf 0x3f3f3f3f

int a[1005

];int g[1005

];int binary_search(int *s,int digit,int

length)

return

left;

}int

main()

memset(g,inf,

sizeof

(inf));

g[0] = -1

;

int len = 1

;

intj;

for(int i=1;i<=n;i++)

printf(

"%d\n

",len-1

);

return0;

}

view code

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