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