PKU暑期訓練02.攔截導彈

題意:
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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章