hdu4604 最長上公升,下降子串行nlogn

2021-07-02 22:49:43 字數 1065 閱讀 8283

將陣列反轉後,求up[i]表示包括i的最長不降序列,down[i]表示最長不上公升序列,取最優。

nlogn的演算法:若要求最長上公升序列,p[i]表示長度為i的序列的末尾最小值(貪心,最小值更有潛力獲得更長的串),很明顯p是單調增的,當加入乙個新元素時,二分p中最靠右的小於它的值j,更新p[j+1],同時記錄up[i]。最長下降同理,p[i]表示長度為i的序列的末尾最大值(貪心,最大值更有潛力獲得更長的串),很明顯p是單調減的。

因為是由貪心得來的,same[i]表示不上公升和不下降序列開始的公共部分。

#include#include#include#include#include#include#include#include#include#include#define inf 1000000000

#define pi acos(-1.0)

#define eps 1e-8

#define seed 131

using namespace std;

typedef pairpii;

typedef unsigned long long ull;

typedef long long ll;

const int maxn=100005;

int n;

int d[maxn];

int up[maxn];

int down[maxn];

int p[maxn];

int same[maxn];

int main()

int len=0;

p[0]=0;

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

else

}len=0;

p[0]=inf;

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

while(l2=d[i])

l2=mid;

else

r2=mid-1;

}same[i]=min(same[i],l2-l1+1);

if(d[i]<=p[len])

else{

int l=0,r=len,mid;

while(l

Dp 最長上公升子串 最長上公升子串行

乙個數的子串bi,當b1 b2 bs的時候,我們稱這個子串是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串 ai1,ai2,aik 這裡1 i1 i2 ik n。如 對於序列 1,7,3,5,9,4,8 有它的一些上公升子串,如 1,7 3,5,9 等等。這些子串中最長...

最長上公升 不下降子串行

最長上公升 不下降子串行 lis 有兩種方法 1.動態規劃,o n 2 容易得出o n 2 的dp遞推公式 d i max 1 1 j d i 為以元素i結尾的最長子序列個數。這樣經過兩重迴圈一次遍歷可以得到最長上公升子串行。view code 1 include 2 include 3 inclu...

nlogn求最長上公升子串行或最長下降子串行

思路很簡單,維護乙個長度為k時的最長上公升子串行結尾元素是d k 的陣列,因為前面的元素已經插入了,後面的元素對前面的只有更優的影響,所以只掃一遍原陣列就能求得。推薦看這篇部落格 講得很詳細 include using namespace std const int n 1e5 7 int a n ...