普通dp(複雜度o^2)
1 #include 2using
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 2using
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...