最長上公升子串行dpO n 2 和 O nlgn

2021-10-07 12:24:00 字數 2015 閱讀 3215

題目位址

描述給定乙個長度為n的數列,求數值嚴格單調遞增的子串行的長度最長是多少。

輸入格式

第一行包含整數n。

第二行包含n個整數,表示完整序列。

輸出格式

輸出乙個整數,表示最大長度。

資料範圍

1≤n≤1000,

−109≤數列中的數≤109

輸入樣例:

73 1 2 1 8 5 6

輸出樣例:

4法1: 用f[i] 表示 數列中以i為結尾的最長嚴格單調遞增的子串行的最長長度,則有當 a[i] > a[j] 中的乙個數時 ,有f[i] = max(f[i],f[j] + 1),相當於可以把a[i] 這個數 接到 a[j] 後面得到的長度。

故有,每次遍歷到第i位置的時候,都可以往前面遍歷找到乙個比他小的,更新f。

c++,**如下:

#include

using

namespace std;

typedef pair<

int,

int> pii;

typedef

long

long ll;

const

int inf =

0x3f3f3f3f

;const

double eps =

1e-5

;const

int mod =

1e9+7;

const

int n =

1010

;//n^2

//f[i] 存當前i號位置為尾最長上公升序列

int a[n]

,f[n]

;int

main()

int res =0;

for(

int i=

1;i<=n;i++

) res =

max(res,f[i]);

cout

}

方法2:用lower_bound將當前的a[i]修改到乙個已經構建上公升序列中(開始為空)。,最大長度就是最長上公升子串行。理由:若當前的a[i]是最大的,則會被加入到最後。若不是最大的,則會更新上公升序列中的某個值。會不會有影響??? 不會。對於乙個已經形成了的上公升序列,後面的值接到末尾,本身就無影響。 當把序列中的某個數更新後,最大長度沒變,序列元素改變,整體不是乙個子串行,但可以把當前更新的元素近似改變為原來的那個數,就很好理解了。更新是為了後序序列更好處理,因為結尾越小,後面的值就越容易修改。為什麼不是插入呢?而是修改,如果是插入,則會造成不是乙個子串行。

(講的繞,看看例子吧)

例如: 1 2 4 7 3 5 6 9 8

11 2

1 2 4

1 2 4 7

1 2 3 7 -> 此時應該把1->2->3看成乙個真正子串行,1->2->3 == 4->7近似看成上乙個子串行,假設是插入的話 1 2 3 4 7,這不是子串行了.

1 2 3 5

1 2 3 5 6

1 2 3 5 6 9

1 2 3 5 6 8

故為6c++**如下:

#include

using

namespace std;

typedef pair<

int,

int> pii;

typedef

long

long ll;

const

int inf =

0x3f3f3f3f

;const

double eps =

1e-4

;const

int mod =

100003

;const

int n =

1000010

;int q[n]

;int

main()

cout

}

有錯誤還請斧正。

最長上公升子串行

問題描述 乙個數的序列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,4,8 等等...

最長上公升子串行

最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...

最長上公升子串行

最長上公升子串行問題 給出乙個由n個數組成的序列x 1.n 找出它的最長單調上公升子串行。即求最大的m和a1,a2 am,使得a1動態規劃求解思路分析 o n 2 經典的o n 2 的動態規劃演算法,設a i 表示序列中的第i個數,f i 表示從1到i這一段中以i結尾的最長上公升子串行的長度,初始時...