1. 程式人生 > >題目1085 攔截導彈

題目1085 攔截導彈

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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
 
提示 [+]

*** 提示已隱藏,點選上方 [+] 可顯示 ***

 
來源

2007年北京大學計算機研究生機試真題

 

【思路】

  


具體參考:演算法之最長遞增子序列,最長公共子序列

/**********************************   日期: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;}


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述