最長遞增子串行 O nlogn

2021-07-04 14:39:09 字數 784 閱讀 8603

使用最基礎的方法計算最長遞增子串行的時間複雜度為o(n^2),

在n值過大時,肯定會超時。因此,在這裡介紹一種優化演算法。

維護乙個一維陣列dp,dp[i]表示最長上公升子串行長度是i的所有子串中末尾最小的那個數,根據這個數字,我們可以比較知道,只要當前考察的這個數比dp[i]大,那麼當前這個數一定能通過dp[i]構成乙個長度為i+1的上公升子串行。當然我們希望在dp陣列中找乙個盡量靠後的數字,這樣我們得到的上公升子串的長度最長,查詢的時候使用二分搜尋,這樣時間複雜度便下降了。

可能解釋的不太好,那麼還是把**發出來吧

talk is cheap,show me the code.

#include

#include

#include

#include

#include

#include

#include

#include

int num[40005];

int dp[40005];

using

namespace

std;

int main()

int len=1;

dp[1]=num[1];

for(int i=2;i<=n;i++)

int pos=lower_bound(dp+1,dp+len+1,num[i])-dp;

dp[pos]=num[i];

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

}return

0;}

最長遞增子串行 O NlogN 演算法

最長遞增子串行 o nlogn 演算法 今天回顧woj1398,發現了這個當時沒有理解透徹的演算法。看了好久好久,現在終於想明白了。試著把它寫下來,讓自己更明白。最長遞增子串行,longest increasing subsequence 下面我們簡記為 lis。排序 lcs演算法 以及 dp演算法...

最長遞增子串行 O NlogN 演算法

今天回顧woj1398,發現了這個當時沒有理解透徹的演算法。看了好久好久,現在終於想明白了。試著把它寫下來,讓自己更明白。最長遞增子串行,longest increasing subsequence 下面我們簡記為 lis。排序 lcs演算法 以及 dp演算法就忽略了,這兩個太容易理解了。假設存在乙...

最長遞增子串行 O NlogN 演算法

今天回顧woj1398,發現了這個當時沒有理解透徹的演算法。看了好久好久,現在終於想明白了。試著把它寫下來,讓自己更明白。最長遞增子串行,longest increasing subsequence 下面我們簡記為 lis。排序 lcs演算法 以及 dp演算法就忽略了,這兩個太容易理解了。假設存在乙...