使用最基礎的方法計算最長遞增子串行的時間複雜度為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演算法就忽略了,這兩個太容易理解了。假設存在乙...