定義d[k]:長度為k的上公升子串行的最末元素,若有多個長度為k的上公升子串行,則記錄最小的那個最末元素。
注意d中元素是單調遞增的,下面要用到這個性質。
首先len = 1,d[1] = a[1],然後對a[i]:若a[i]>d[len],那麼len++,d[len] = a[i];
否則,我們要從d[1]到d[len-1]中找到乙個j,滿足d[j-1]
最終答案就是len
利用d的單調性,在查詢j的時候可以二分查詢,從而時間複雜度為nlogn。
/* o(nlogn) solution */
/* * 二分查詢求大於等於x的下界
* 這裡陣列a是從下標1開始的
*/int binary_search(int *a, int n, int x)
return left;
}unsigned int lis2(int a, int n)
else
} return len;
}
最長上公升子串行nlogn演算法
這題目是經典的dp題目,也可叫作lis longest increasing subsequence 最長上公升子串行 或者 最長不下降子串行。很基礎的題目,有兩種演算法,複雜度分別為o n logn 和o n 2 a.o n 2 演算法分析如下 a 1 a n 存的都是輸入的數 1 對於a n 來...
最長上公升子串行nlogn演算法
這題目是經典的dp題目,也可叫作lis longest increasing subsequence 最長上公升子串行 或者 最長不下降子串行。很基礎的題目,有兩種演算法,複雜度分別為o n logn 和o n 2 a.o n 2 演算法分析如下 a 1 a n 存的都是輸入的數 1 對於a n 來...
最長上公升子串行nlogn演算法
剛才用o n 2 的dp演算法做了最長上公升子串行,具體見poj2533解題報告。後來在網上看到說lis問題有o nlogn 的演算法,於是拿來小研究了一下。這個演算法其實已經不是dp了,有點像貪心。至於複雜度降低其實是因為這個演算法裡面用到了二分搜尋。本來有n個數要處理是o n 每次計算要查詢n次...