題意:
b:攔截導彈
查看 提交 統計 提問
總時間限制: 1000ms 內存限制: 65536kB
描述
某國爲了防禦敵國的導彈襲擊,開發出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲,並觀測到導彈依次飛來的高度,請計算這套系統最多能攔截多少導彈。攔截來襲導彈時,必須按來襲導彈襲擊的時間順序,不允許先攔截後面的導彈,再攔截前面的導彈。
輸入
輸入有兩行,
第一行,輸入雷達捕捉到的敵國導彈的數量k(k<=25),
第二行,輸入k個正整數,表示k枚導彈的高度,按來襲導彈的襲擊時間順序給出,以空格分隔。
輸出
輸出只有一行,包含一個整數,表示最多能攔截多少枚導彈。
樣例輸入
8
300 207 155 300 299 170 158 65
樣例輸出
6
http://bailian.openjudge.cn/2016acmmid/b/
動態規劃水題。dp[1] = 1; dp[i] = max(dp[i],dp[j]+1) (a[i]<=a[j]&&i>j)
這題的升級版可以用
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 25 + 5;
int h[maxn];
int n;
int dp[maxn];
int main()
{
scanf("%d",&n);
int ans1 = 0;
for(int i =0;i<n;i++)
{
scanf("%d",&h[i]);
}
for(int i =0;i<n;i++)
{
dp[i] = 1;
for(int j= 0;j<i;j++)
{
if(h[i]<=h[j])
{
dp[i] = max(dp[i],dp[j]+1);
}
}
}
for(int i =0;i<n;i++)
{
if(ans1<=dp[i]) ans1 = dp[i];
}
printf("%d",ans1);
return 0;
}