其實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...