**
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 來...