hdu 1257 最少攔截系統 動態規劃

最少攔截系統

  拿到這道題的時候,是剛開始接觸dp,今晚又看到它了,覺得它應該算是一道比較經典的dp題,因此,就又拿出來看了

這道題重要的是看懂題意,我做的時候,剛開始總wa,後來才明白題意理解錯了


題意:面對敵方陸續打來的導彈,我方需要配備幾套攔截系統,才能攔截敵人所有的導彈(攔截系統所能攔截的導彈的高度必須低於上次此套系統攔截的導彈的高度,第一次攔截的高度H < 30000)

              

例如,導彈打來的高度依次爲

 data[N]     389 207 155 300 299 170 158 65

sum[N]            1                   1                  1                       2                    2                        2                             2                    1


上圖中1,2即是攔截系統的編號,sum[N]數組存儲的是相應位置上的炮彈被哪套攔截系統所攔截

  解題思路:遍歷data數組,同時跟前面的數作比較,如果高於前面的數就加1,,


M - 最少攔截系統
Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

某國爲了防禦敵國的導彈襲擊,發展出一種導彈攔截系統.但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能超過前一發的高度.某天,雷達捕捉到敵國的導彈來襲.由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈. 
怎麼辦呢?多搞幾套系統唄!你說說倒蠻容易,成本呢?成本是個大問題啊.所以俺就到這裏來求救了,請幫助計算一下最少需要多少套攔截系統. 
 

Input

輸入若干組數據.每組數據包括:導彈總個數(正整數),導彈依此飛來的高度(雷達給出的高度數據是不大於30000的正整數,用空格分隔) 
 

Output

對應每組數據輸出攔截所有導彈最少要配備多少套這種導彈攔截系統. 
 

Sample Input

8 389 207 155 300 299 170 158 65
 

Sample Output

2
 



現給出代碼:

#include <iostream>
#include<cstdio>
#include<string.h>
using namespace std;


int main()
{
    int M,N;
    int data[1000+10];
    int dp[1000];
    int i, j;
    while(~scanf("%d",&M))
    {
        for(i = 0; i < M; i++)
        {
            scanf("%d",&data[i]);
            dp[i]=1;
        }
        for(i = 0; i < M; i++)
        {
            for(j = 0; j < i;j++)
            {
                    if(data[i] > data[j])
                    {
                        dp[i] = max(dp[i],dp[j]+1);//更新
                    }
            }
        }
         int ans = 0;
            for(i = 0; i < M; i++)
            {
                ans = max(ans,dp[i]);
            }
        printf("%d\n",ans);
    }


        return 0;
}

發佈了34 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章