問題描述:給出乙個序列,找出其最長不降子充
例如: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的...