最長不降子序nlogn 原理

2021-08-29 13:10:46 字數 852 閱讀 7938

問題描述:給出乙個序列,找出其最長不降子充

例如:4 1 3 5 6 2 7結果為:1 3 5 6

題解:陣列id[n] = .

陣列f[n],設j指向id,i指向f,f[i]表示在長度為j的序列中,最長不降子序長度為i的子串行的最後乙個元素的最小值。所以遞推公式為:

0<=i<=len(len:為已求出的最長不降子序的長度)

如果id[j] <= f[i] (即:長度為i的不降子序的最後乙個元素有更小的值id[j],

則更新f[i])則f[i] = id[j]

如果i == len 並且 id[j] > f[i ] (即:id[j] 可以疊加到已求出的最長子序列上,成為len = len+1長度的不降子序上)。則f[i +1] = id[j]

則最後我們的答案就是len

這樣很明顯我們的程式有兩個for迴圈,分別是i,j(0<=j<=n,0<=i<=len)

這樣乙個個查詢的時間為n*n

由於f[i]表示在長度為j的序列中,最長不降子序長度為i的子串行的最後乙個元素的最小值,所以f為遞增,可以用二分查詢法找出將要重新整理的f單元.

二分查詢的時間為logn

所以總時間為n*logn

zju一道典型題

輸入資料量比較大,一定要用c的輸入輸出才可以ac

#include

#include

using namespace std;

int id[40000],f[40000];

int main()

if(left != len)

f[left] = id[j];

else

f[len++]=id[j];

}//cout<

最長不降子串行 NlogN解法

這是乙個很好的題目。題目的演算法還是比較容易看出來的,就是求最長上公升子串行的長度。不過這一題的資料規模最大可以達到40000,經典的o n 2 的動態規劃演算法明顯會超時。我們需要尋找更好的方法來解決是最長上公升子串行問題。先回顧經典的o n 2 的動態規劃演算法 設a i 表示序列中的第i個數,...

最長不降子串行的NlogN的解法

這是乙個很好的題目。題目的演算法還是比較容易看出來的,就是求最長上公升子串行的長度。不過這一題的資料規模最大可以達到40000,經典的o n 2 的動態規劃演算法明顯會超時。我們需要尋找更好的方法來解決是最長上公升子串行問題。先回顧經典的o n 2 的動態規劃演算法 設a i 表示序列中的第i個數,...

動態規劃 最長不降子串行 NlogN演算法

nlogn演算法精髓在於設立陣列dp dp i 表示長度為i的不下降序列中結尾元素的最小值,用len表示陣列目前的長度,演算法完成後len的值即為最長不下降子串行的長度。設當前的以求出的長度為len,則判斷num i 和dp len 1.如果num i dp len 即num i 大於長度為len的...