動態規劃求最長降序序列

為啥不能重名發表於2020-11-23

這裡可以用到兩個stl庫中的兩個函式,lower_bound() 和 upper_bound().
lower_bound(a+1,a+n+1,x)是求一個序列中第一個大於等於x的數的位置。
upper_bound(a+1,a+n+1,x)是求一個序列中第一個大於x的數的位置。
這裡的序列必須是有序序列,所謂有序系列,在STL庫中預設有序序列為升序序列,而且一旦對降序序列做upper_bound(),就會發生錯誤。
那麼如果我們想要得到一個有序序列中第一個小於或者小於等於x的數的位置,又該怎麼辦那?
我們可以把升序序列當做是降序序列,利用lower_bound(a+1,a+n+1,x,cmp)找到這個降序序列中第一個小於x的數的位置。
這裡對於這個cmp函式,我們規定bool cmp(int a,int b){return a>b;}
當然C++中有關於大於的函式,可以代替我們上文中提到的cmp函式,lower_bound(a+1,a+n+1,x,greater<int>());

O(nlogn)的時間求最長降序序列

首先,我們需要一個陣列s[],實質上充當棧的作用,從頭往後遍歷陣列
a[],遇到小於棧頂元素的數入棧,否則,利用lower_bound(d,d+n,a[i])找到棧中第一個小於a[i]的數,並將這個數踢出棧,讓a[i]代替這個數,其實就是一個賦值操作,這樣找到的序列一定是最長的降序序列,升序序列與之亦同,自證不再贅述。

相關文章