最長遞增子串行LIS演算法

2021-06-21 14:55:14 字數 764 閱讀 1498

dp o(n2)的演算法是比較容易想到的,但用時間複雜度為o(n2)的方法解 poj 3903

stock exchange 問題時 tle。故需要更快的演算法,下面介紹乙個o(nlogn)的dp +

二分查詢的演算法。

p[i]52

1453

d[i]11

1232

引入陣列s,s[i] 表示處在長度為i的lis位置上的最後乙個元素。如:s[1]=1,

s[2]=3,s[3]=5。

/* poj 3903 o(nlogn) 63 ms */

#include

#include

#define max_len 100000

int g_p[max_len];

int g_s[max_len + 1];

int bisearch(int *s, int len, int v);

int main()

len = 1;

pos = 0;

g_s[len] = g_p[0];

for (i = 1; i < l; ++i)

else

}printf("%d\n", len);

return 0;

}int bisearch(int *s, int len, int v)

else if (s[m] > v)

else

}return (s[m] > v) ? m : m+1;

}

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