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

2021-08-20 19:08:52 字數 614 閱讀 5487

** 

hdu 1950

最長上公升子串行問題可以優化為nlogn的演算法。

定義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。

下面的**是自己寫的

#include#include#include#include#includeusing namespace std;

#define rep(i,a,b) for(int i=(a);i<=(b);++i)

#define max 40010

int num[max];

int dp[max];//dp[len]為長度為len的最長上公升子串行的最小末尾

int main()

else

//rep(j,1,len)cout<

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

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

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

定義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 中找到乙個...

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

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