DP 最長上公升子串行(n 2與n log n)

2022-07-27 05:15:11 字數 1262 閱讀 6256

作為noip中的知名的問題,最長不下降子串行可謂是灰常重要……

廢話不多說,正題:

最長不下降有兩種方法,然而都是dp……

裸dp,時間複雜度o(n^2):

定義:dp[ i ]=以a[ i ]為結尾的最長上公升子串行的長度,so,dp[ i ]=max(1,dp[ j ]+1 | j < i且a[ j ] < a[ i ] );

**:

1

intn;

2int a[10000];3

int dp[10000];4

5void

solve()

12 res=max(res,dp[i]);

13}

14 cout15 }

但…………此**是我從書上抄的,因為…………我也不會…………我也不想學………………因為我會o(n log n)的……orz;

下面介紹o(n log n)的:

dp[1]=a[1];

從2————n for迴圈 

我們定義dp[i]為長度為i的最長上公升子串行的最後乙個數的最小值,由此可推得dp是不下降的,每當我們發現了乙個數比dp[len]大,就len++,dp[len]=這個數,否則,在dp中尋找乙個dp[j-1]《這個數**:

1

int dp[1000]2

void

solve()

7 printf("

%d",lower_bound(dp+1,dp+1+n,inf)-dp);

8 }

好吧,以上這個也是我抄的,但貌似不太靠譜,下乙個是我的,反正比上面的靠譜點兒……

1 #include2 #include3 #include4 #include5 #include

6 #include7

using

namespace

std;

8int d[2000000],a[2000000

],n,len,l,r,mid;910

intmain()else

26 d[l]=min(a[i],d[l]);27}

28}29 printf("%d"

,len);

30return0;

31 }

上面的也不靠譜……

1 d[1]=a[1]; 

2int len=1;3

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

9 }

LIS 最長上公升子串行N 2以及nlogn演算法

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

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 等等。這些子串中最長...

最長上公升子串行(DP)

time limit 3000ms memory limit 65536k 有疑問?點這裡 乙個數的序列bi,當b 1 b 2 b s的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a 1,a 2,a n 我們可以得到一些上公升的子串行 a i1,a i2,a ik 這裡1 i 1 i 2 i...