最長上公升子串行求長度

2022-06-02 07:48:09 字數 1412 閱讀 5134

普通dp(複雜度o^2)

1 #include 2

using

namespace

std;34

const

int n = 1010;5

inta[n], dp[n], n;67

intmain()

1819

int res = 0;20

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

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

2223 cout24return0;

25 }

二分dp(目前有問題,來日再來研究)

思路:用 lis 陣列儲存 最長上公升子串行的 序列 的最優情況 。

在大於lis [ len ]時 len++,在小於lis[ len ]時可以將arr[ i ]在 lis 中的數進行替換掉。所以此演算法主要是在不停的找最合適的起點和最合適的終點。

舉例:輸入陣列:2 1 5 3 6 4 8 9 7  顯而易見 答案為:5

以下是 lis 陣列的變化情況 :

第一步:2                   替換

第二步:1                   替換

第三步:1 5                加入

第四步:1 3                替換

第五步:1 3 6             加入

第六步:1 3 4             替換

第七步:1 3 4 8           加入

第八步:1 3 4 8 9        加入

第九步:1 3 4 7 9       替換     (這裡是不是有問題??明明7在原序列中是在9的後面)

dp[i]表示長度為 i 的子串行中,末尾元素的最小值,且dp陣列是嚴格單調增加的。列舉到第 j 個數時,如果 j 大於dp陣列當前最大長度所對應的值,則說明 j 比當前上公升子串行的末尾還大,那麼就將 j 加入dp陣列。如果 j 小於dp陣列當前最大長度所對應的值,則說明加上 j 以後就不構成上公升子串行了,需要在dp陣列中找到第乙個大於 j 的數,用 j 去替換它。由於dp陣列始終是單調遞增的,可以用二分法,最後dp陣列的長度就是最長上公升子串行長度。

1 #include 2

using

namespace

std;34

const

int n = 100010;5

6int

a[n], dp[n], n, cnt;78

int find(int

x) 15

return

l;16}17

intmain()

27else31}

3233 cout34return0;

35 }

求最長上公升子串行的長度

假設要尋找最長上公升子串行的序列是a n 然後尋找到的遞增子串行放入到陣列b中。1 當遍歷到陣列a的第乙個元素的時候,就將這個元素放入到b陣列中,以後遍歷到的元素都和已經放入到b陣列中的元素進行比較 2 如果比b陣列中的每個元素都大,則將該元素插入到b陣列的最後乙個元素,並且b陣列的長度要加1 3 ...

求最長上公升子串行

q 有乙個長為n的數列a0,a1,an 1。求出這個序列中最長的上公升子串行的長度。上公升子串行指的是對於任意的i大致思路是這樣的,初始設定乙個最大長度maxlength為0,從數列的第一項開始遍歷,只要當前項大於前一項則加入,否則繼續遍歷,直至此次遍歷結束。然後與maxlength做對比,如果大於...

求最長上公升子串行

由n個不相同的整數組成的數列,記為 a 1 a 2 a n 且a i a j i j 例如,3,18,7,14,10,12,23,41,16,24.若存在i1 i2 3 e且有a i1 2 e 則稱其為長度為e的不下降子串行。如上例中3,18,23,24就是乙個長度為4的不下降子串行,同時也有3,7...