題目1085 攔截導彈
阿新 • • 發佈:2018-11-16
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
題目描述某國為了防禦敵國的導彈襲擊,開發出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲,並觀測到導彈依次飛來的高度,請計算這套系統最多能攔截多少導彈。攔截來襲導彈時,必須按來襲導彈襲擊的時間順序,不允許先攔截後面的導彈,再攔截前面的導彈。
輸入
每組輸入有兩行,第一行,輸入雷達捕捉到的敵國導彈的數量k(k<=25),第二行,輸入k個正整數,表示k枚導彈的高度,按來襲導彈的襲擊時間順序給出,以空格分隔。
輸出
每組輸出只有一行,包含一個整數,表示最多能攔截多少枚導彈。
樣例輸入
4
9 6 7 8
7
4 5 6 7 13 42 3
5
6 5 4 3 5
0
樣例輸出
2
2
4
提示 [+]
*** 提示已隱藏,點選上方 [+] 可顯示 ***
來源
【思路】
具體參考:演算法之最長遞增子序列,最長公共子序列
/********************************** 日期:2013-3-25* 作者:SJF0115* 題號: 題目1085: 攔截導彈* 來源:http://acmclub.com/problem.php?id=1085* 結果:AC* 來源:2007年北京大學計算機研究生機試真題* 總結:**********************************/ #include<stdio.h>#include<string.h>int Height[26];int MaxLen[26];void LIS(int k){ memset(MaxLen,0,sizeof(MaxLen)); for(int i = 1;i <= k; i++){ MaxLen[i] = 1; //遍歷其前所有導彈高度 for(int j = 1;j < i;j++){ //如果當前導彈高度小於等於j號導彈 if(Height[i] <= Height[j]){ //把當前導彈放在j號導彈後,其最長不增子序列長度為j號導彈結尾的最長不增子序列長度 + 1 int preMax = MaxLen[j] + 1; if(preMax > MaxLen[i]){ MaxLen[i] = preMax; } } } }} int main(){ int N,i; //freopen("C:\\Users\\SJF\\Desktop\\acm.txt","r",stdin); while(scanf("%d",&N)!=EOF){ //輸入導彈高度 for(i = 1;i <= N;i++){ scanf("%d",&Height[i]); } LIS(N); int Max = -1; //輸出最長不增子序列的長度即能攔截的導彈數 for(i = 1;i <= N;i++){ if(Max < MaxLen[i]){ Max = MaxLen[i]; } } if(N != 0){ printf("%d\n",Max); } } return 0;}