【演算法實驗四】--【動態規劃】--防衛導彈
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; }