dp學習筆記1

2021-09-06 08:43:54 字數 1414 閱讀 6354

其實dp之前早就做過了,感覺有點遺忘,拿來複習複習。

1/*2

某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。

3但是這種飛彈攔截系統有乙個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。

4某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的飛彈。

5輸入飛彈依次飛來的高度(雷達給出的高度資料是不大於30000的正整數),

6計算這套系統最多能攔截多少飛彈,如果要攔截所有飛彈最少要配備多少套這種飛彈攔截系統。7*/

8/*9分析:

10最多能攔截多少飛彈,相當於求最大非上公升子串行的長度

11最少要配備多少套這種飛彈攔截系統,相當於求最長上公升序列的長度

12*/

13//

dp[i]表示前i個飛彈中飛彈i最多能攔截到的飛彈的個數,則有dp[i]=max(dp[j])+1(其中h[i]<=h[j]&&0<=j14

/*15

樣例輸入:

16389 207 155 300 299 170 158 65

17樣例輸出:

186 2

19*/

2021 #include22 #include23 #include24

const

int inf=1e9;

25using

namespace

std;

26int h[100

];27

int dp1[100];//

保留最長非上公升子串行

28int dp2[100];//

最長遞增子串行

2930

intmain()

36 memset(dp1,0,sizeof

(dp1));

37 memset(dp2,0,sizeof

(dp2));

38int umax=0,dmax=0;39

//求最長非上公升子串行

40for(int i=1;i<=n;i++)47}

48 dp1[i]=ans+1;//

加上自己本身

49 dmax=max(dmax,dp1[i]);50}

51//

求最長上公升子串行

52for(int i=1;i<=n;i++)58}

59 dp2[i]=ans+1

;60 umax=max(dp2[i],umax);61}

62 printf("

%d %d\n

",dmax,umax);63}

64return0;

65 }

dp學習筆記1

其實dp之前早就做過了,感覺有點遺忘,拿來複習複習。1 2 某國為了防禦敵國的飛彈襲擊,發展出一種飛彈攔截系統。3但是這種飛彈攔截系統有乙個缺陷 雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。4某天,雷達捕捉到敵國的飛彈來襲。由於該系統還在試用階段,所以只有一套系統...

區間dp學習筆記

定義 區間動態規劃問題一般都是考慮,對於每段區間,他們的最優值都是由幾段更小區間的最優值得到,是分治思想的一種應用,將乙個區間問題不斷劃分為更小的區間直至乙個元素組成的區間,列舉他們的組合 求合併後的最優值。設f i,j 1 i j n 表示區間 i,j 內的數字相加的最小代價最小區間f i,i 0...

區間dp學習筆記

怎麼辦,膜你賽要掛慘了,下午我還在學區間 dp 不管怎麼樣,計畫不能打亂 4 不 4 為啥我一開始就先弄模板呢?因為這東西看模板就能看懂。for int i 2 i len i 列舉區間長度 for int l 1,r l len 1 r n l r 列舉左端點和右端點 以下你可以搞一下事情 for...