最長上升子序列——攔截導彈 簡單版

問題 D: 攔截導彈 簡單版

時間限制: 1 Sec  內存限制: 128 MB
提交: 15  解決: 5
[提交][狀態][討論版][命題人:add_lyf]

題目描述

 某國爲了防禦敵國的導彈襲擊,發展出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲。由於該系統還在試用階段,所以只有一套系統,因此有可能不能攔截所有的導彈。

輸入導彈依次飛來的高度(雷達給出的高度數據是不大於30000的正整數,導彈數不超過1000),計算這套系統最多能攔截多少導彈,如果要攔截所有導彈最少要配備多少套這種導彈攔截系統。

輸入

輸入有兩行, 
第一行,輸入雷達捕捉到的敵國導彈的數量k(k<=25), 
第二行,輸入k個正整數,表示k枚導彈的高度,按來襲導彈的襲擊時間順序給出,以空格分隔。

輸出

第一行爲最多能攔截的導彈數;

第二行爲要攔截所有導彈最少要配備的系統數

樣例輸入

8
389 207 155 300 299 170 158 65 

樣例輸出

6
2

最多能攔截的導彈數:最長下降子序列

要攔截所有導彈最少要配備的系統數:不斷更新系統的高度,直到所有系統高度都比當前導彈高度小,增加系統數

注意等號時導彈能攔截,系統數不需要增加

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
using namespace std;
int k,h[3000],ans,dp1[3000],dp2[3000],sy,j;
int main()
{
    while(cin>>k)
    {
       for(int i=0;i<k;i++)
        cin>>h[i];
    ans=0;
    for(int i=0;i<k;i++)
    {
        dp1[i]=1;
        for(int j=0;j<i;j++)
            if(h[j]>=h[i])
            dp1[i]=max(dp1[i],dp1[j]+1);
        ans=max(ans,dp1[i]);
    }
    sy=1;
    dp2[0]=h[0];
    for(int i=1;i<k;i++)
    {
        for(j=0;j<sy;j++)
            if(h[i]<=dp2[j])
            {
                dp2[j]=h[i];
                break;
            }
            if(j>=sy)dp2[sy++]=h[i];
    }
    cout<<ans<<endl;
    cout<<sy<<endl;
    }
 
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章