動態規劃 最長不下降子串行

2021-10-10 03:30:53 字數 2034 閱讀 3492

參考:

每一次從頭掃瞄找出最佳答案。

int a[maxn]

, d[maxn]

;intdp(

)}return ans;

}

參考了這篇文章

那麼**如下:

for

(int i =

0; i < n;

++i)

scanf

("%d"

, a + i)

;memset

(dp,

0x1f

,sizeof dp)

;mx = dp[0]

;for

(int i =

0; i < n;

++i)

ans =0;

while

(dp[ans]

!= mx)

++ans;

例題:

某國為了防禦敵國的飛彈襲擊,研發出一種飛彈攔截系統。但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試驗階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。

輸入資料只有一行,該行包含若干個資料,之間用半形逗號隔開,表示飛彈依次飛來的高度(飛彈最多有 20 枚,其高度為不大於 30000 的正整數)。

輸出資料只有一行,該行包含兩個資料,之間用半形逗號隔開。第乙個資料表示這套系統最多能攔截的飛彈數;第二個資料表示若要攔截所有飛彈至少要再新增多少套這樣的系統。

389

,207

,155

,300

,299

,170

,158

,65

6

,1

每個測試點限時 1 秒。

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1e5+2;

int dp[maxn]

;// dp[k]表示長度為k的不下降子串行末尾元素的最小值

// int minh[maxn]; //記錄從第i項開始,剩下最大能消滅的飛彈數量

vector<

int> v;

intup_bound

(int l,

int r,

int x)

return l;

}int

down_bound

(int l,

int r,

int x)

intmain()

v.push_back(0

);reverse

(v.begin()

, v.

end())

;int len =1;

dp[1]

= v[1]

;for

(int i =

2; i < v.

size()

; i++

)else

} cout << len <<

",";

//第二問就出最大下降子串行

len =1;

dp[1]

= v[1]

;for

(int i =

2; i < v.

size()

; i++)}

cout << len -

1<< endl;

return0;

}/*90 103 99 83 102 70 86 70 99 71*/

最長不下降子串行 動態規劃

一。問題描述 給定乙個序列a1 a2 a3 an現要求你從中找到最長的不下降子串行 二。問題分析 該問題可以和之前的max sum問題模擬,如果從決策的角度入手,直接引入並定義狀態f i 為 a i 所在子串行到i的長度 那我們的決策策略應該就是使得 f i 最大 所以基於這個分析我們很容易列出動態...

動態規劃 最長不下降子串行LIS

找出一組資料中最長的不下降子串行的長度。1,連續情況。即必須要求子數列連續相依 1 2 3 1 2 7 9中的最長子串行為3 1,2,3 易得遞推公式 if f i f i 1 dp i dp i 1 1 else dp i 1 includeusing namespace std define m...

動態規劃 最長不下降子串行 簡潔

問題描述 求乙個數列的最長不下降子串行.設有由n個不相同的整數組成的數列,記為 a 1 a 2 a n 且a i a j i j 若存在i1a n 1 則存在長度為1的序列a n 1 或a n 2 之後的過程類似,當前滿足條件找出後面序列長度的最大值進行加一.include includeusing...