1. 程式人生 > >【演算法實驗四】--【動態規劃】--防衛導彈

【演算法實驗四】--【動態規劃】--防衛導彈

1046.防衛導彈

時限:1000ms 記憶體限制:10000K  總時限:3000ms

描述

一種新型的防衛導彈可截擊多個攻擊導彈。它可以向前飛行,也可以用很快的速度向下飛行,可以毫無損傷地截擊進攻導彈,但不可以向後或向上飛行。但有一個缺點,儘管它發射時可以達到任意高度,但它只能截擊比它上次截擊導彈時所處高度低或者高度相同的導彈。現對這種新型防衛導彈進行測試,在每一次測試中,發射一系列的測試導彈(這些導彈發射的間隔時間固定,飛行速度相同),該防衛導彈所能獲得的資訊包括各進攻導彈的高度,以及它們發射次序。現要求編一程式,求在每次測試中,該防衛導彈最多能截擊的進攻導彈數量,一個導彈能被截擊應滿足下列兩個條件之一: a)它是該次測試中第一個被防衛導彈截擊的導彈; b)它是在上一次被截擊導彈的發射後發射,且高度不大於上一次被截擊導彈的高度的導彈。

輸入

多個測例。 每個測例第一行是一個整數n(n不超過100),第二行n個整數表示導彈的高度(數字的順序即發射的順序)。 n=0表示輸入結束。

輸出

每個測例在單獨的一行內輸出截擊導彈的最大數目。

輸入樣例

5 5 6 100 6 61 0

輸出樣例

2

解析:這個老師上課講了思路,我就按照老師的思路來寫吧。輸入了n個導彈,高度存在high[n]陣列中,設num陣列是存打下來導彈的個數。根據題意,我們可以從後面開始找,首先如果只打第n個導彈的話肯定可以打下來,則num[n]=1,現在算倒數第二個high[n-1],如果倒數第二個導彈高度大於等於倒數第一個即high[n-1]>=high[n],那麼num[n-1]=num[n]+1,反之則num[n-1]=num[n]。以此類推,如果找第i個導彈時,將它於第i+1~n個比較,若high[i]>high[i+1],則num[i]=num[i+1]+1,不斷更新其為最大值。程式碼如下:

#include <stdio.h> #include <stdlib.h> #include<string.h> int main() {     int n;     while(scanf("%d",&n)&&n)     {         int high[101]={0},num[101];         for(int i=0;i<n;i++)             scanf("%d",&high[i]);         num[n-1]=1;         for(int i=n-2;i>=0;i--)         {             for(int j=i+1;j<n;j++)             {                 if(high[i]>=high[j])                 {                     if(num[i]<num[j]+1)                        num[i]=num[j]+1;                 }             }         }         int max=0;         for(int i=0;i<n;i++)         {             if(num[i]>max)                 max=num[i];         }         printf("%d\n",max);     }     return 0; }