題目描述
某國為了防御敵國的導彈襲擊,開發出一種導彈攔截系統。但是這種導彈攔截系統有一個缺陷:雖然它的第一發炮彈能夠到達任意的高度,但是以後每一發炮彈都不能高於前一發的高度。某天,雷達捕捉到敵國的導彈來襲,並觀測到導彈依次飛來的高度,請計算這套系統最多能攔截多少導彈。攔截來襲導彈時,必須按來襲導彈襲擊的時間順序,不允許先攔截後面的導彈,再攔截前面的導彈。
輸入
每組輸入有兩行,第一行,輸入雷達捕捉到的敵國導彈的數量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年北京大學計算機研究生機試真題
【思路】
具體參考:算法之最長遞增子序列,最長公共子序列
[cpp]
/*********************************
* 日期: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;
}
/*********************************
* 日期: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;
}