最長上公升子串行nlog n

2021-07-09 05:47:38 字數 1915 閱讀 3046

nlog(n)的方法從很久之前就看了,愣是沒看懂,因為這個條件

現在,我們仔細考慮計算f[t]時的情況。假設有兩個元素a[x]和a[y],滿足 (f儲存lis長度)

(1)x < y < t 

(2)a[x] < a[y] < a[t] 

(3)f[x] = f[y] 

沒看懂,當a[x]

其實這只是傳遞乙個思想而已,當兩者的lis都一樣時取最小值效果更好。只要明白這一點就行了。

再根據那個思想,我們會得到乙個啟示:根據f的值進行分類。對於f的每乙個取值k,我們只需要保留滿足f[t] = k的所有a[t]中的最小值。設d[k]記錄這個值,即d[k] = min (f[t] = k)。 

注意到d的兩個特點: (這個特點很重要)

(1) d[k]的值是在整個計算過程中是單調不下降的。 

(2) d的值是有序的,即d[1] < d[2] < d[3] < ... < d[n]。 

利 用d,我們可以得到另外一種計算最長上公升子串行長度的方法。設當前已經求出的最長上公升子串行長度為len。先判斷a[t]與d[len]。若a [t] > d[len],則將a[t]接在d[len]後將得到乙個更長的上公升子串行,len = len + 1, d[len] = a [t];否則,在d[1]..d[len]中,找到最大的j,滿足d[j] < a[t]。令k = j + 1,則有a [t] <= d[k],將a[t]接在d[j]後將得到乙個更長的上公升子串行,更新d[k] = a[t]。最後,len即為所要求的最長上 公升子串行的長度。 

在 上述演算法中,若使用樸素的順序查詢在d[1]..d[len]查詢,由於共有o(n)個元素需要計算,每次計算時的複雜度是o(n),則整個演算法的 時間複雜度為o(n^2),與原來的演算法相比沒有任何進步。但是由於d的特點(2),我們在d中查詢時,可以使用二分查詢高效地完成,則整個演算法 的時間複雜度下降為o(nlogn),有了非常顯著的提高。需要注意的是,d在演算法結束後記錄的並不是乙個符合題意的最長上公升子串行!

例如:012

3456

a173

5948

c-113(7)(4)

59(8)

#include #include #include #include #include using namespace std;

#define n 200001

int n,a[n],dp[n];

int find(int len,int n) //二分,返回值為x,則c[x]>n>c[i-1],返回比n大的最小值

cout《有個更剪短優化的**,就是利用stl中的lower_bound

函式lower_bound()在first和last中的

前閉後開

區間進行二分查詢,返回大於或等於val的

第乙個元素

位置。如果所有元素都小於val,則返回

last

的位置

函式upper_bound()返回的在前閉後開區間查詢的關鍵字的上界,如乙個陣列number序列1,2,2,4.upper_bound(2)後,返回的位置是3(下標)也就是4所在的位置,同樣,如果插入元素大於陣列中全部元素,返回的是last。(注意:此時陣列下標越界!!)

返回查詢元素的最後乙個可安插位置,也就是「元素值》查詢值」的第乙個元素的位置

#include#includeusing namespace std;

const int max=100100;

int num[max],top=0;

int main()

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

}

最長上公升子串行 nlogn

最長上公升子串行中對於數ipt i 向前遍歷,當數ipt j 小於ipt i 則ipt j 可作為上公升序列中ipt i 的前乙個數字 dp i max 若現在有兩個狀態a,b 滿足dp a dp b 且 ipt a ipt b 則對於後面的狀態dp a 更優 因為若ipt i dp b 則必然ip...

最長上公升子串行 nlogn

fi 表示i長度的上公升子串行的最小末尾元素值 用貪心的辦法,每次訪問乙個小於當前末尾值的元素,就往前二分地找乙個可以替換的位置 include include include include using namespace std define debug x cerr x x endl cons...

最長上公升子串行nlogn演算法

這題目是經典的dp題目,也可叫作lis longest increasing subsequence 最長上公升子串行 或者 最長不下降子串行。很基礎的題目,有兩種演算法,複雜度分別為o n logn 和o n 2 a.o n 2 演算法分析如下 a 1 a n 存的都是輸入的數 1 對於a n 來...