動態規劃(三)最長遞增子串行zZ

2021-10-04 16:01:13 字數 1161 閱讀 4096

最長遞增子串行是動態規劃經典問題之一,與最大連續子串行的思路一致,問題描述是在乙個已知序列中,取若干元素(不必連續)按原先的先後順序組成乙個新序列使得新序列是遞增的,最長子序列問題就是求給定序列的所有遞增子串行中最長的那個子串行的長度。

分析:(1)用陣列a[n]儲存序列a0~an-1。

(2)設定陣列dp[n],dp[i]表示以a[i]結尾的連續子串行的最大長度

(3)問題邊界:當n=0時,連續遞增子串行,dp[0] = 1 

(4)對於dp[i]的取值有兩種情況:

1)a[i]比之前所有的元素都小,dp[i] = 1

2)存在j使得a[j] < a[i],0 <= j < i,取dp[j]最大的 (需要遍歷dp[0]~dp[i - 1]),dp[i] = dp[j] + 1

某國為了防禦敵國的飛彈襲擊,開發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲,並觀測到飛彈依次飛來的高度,請計算這套系統最多能攔截多少飛彈。攔截來襲飛彈時,必須按來襲飛彈襲擊的時間順序,不允許先攔截後面的飛彈,再攔截前面的飛彈。 

每組輸入有兩行,

第一行,輸入雷達捕捉到的敵國飛彈的數量k(k<=25),

第二行,輸入k個正整數,表示k枚飛彈的高度,按來襲飛彈的襲擊時間順序給出,以空格分隔。

每組輸出只有一行,包含乙個整數,表示最多能攔截多少枚飛彈。
示例1

8

300 207 155 300 299 170 158 65

6
#include #include #include using namespace std;

int main()

dp[0] = 1; //問題邊界

int maximum = 1;

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

}maximum = max(dp[i], maximum);

}cout << maximum << endl;

}return 0;

}

動態規劃 最長遞增子串行

給出序列 1 2 3 4 2 5 3 4 a 1 1,a 2 2,a 7 3,a 8 4 求其最長的遞增子串行,以上最長遞增子串行為 1 2 3 4 5 問題細分 初始化條件f 1 1,序列只有1個長度即為1 f 2 a 2 與下標小於2的比較,即a 1 比較,a 2 a 1 因此更新f 2 f 1...

動態規劃 最長遞增子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度 例項 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行為 2,3,7,101 長度為4說明 可能會有多種最長上公升子串行的和,只需要輸出對應長度即可 演算法的時間複雜度應為o n2 首先,dp陣列的定義如下 dp...

動態規劃 最長遞增子串行

最長遞增子串行是動態規劃中最經典的問題之一,該問題描述的是在乙個已知序列中,取出若干元素 不必連續 組成乙個新的序列,子串行的各個數先後順序保持不變,且對子序列中的任意下標x令dp i 表示以a i 作為末尾的最長遞增子串行的長度。於是,通過設定這麼乙個陣列,最長遞增子串行的長度便是陣列dp中的最大...