导弹防御系统
这题我想了半天,还是不会,哭哭,看的别人的思路。
题目
问题描述
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。
输入形式
每组输入有两行,
第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25),
第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。
输出形式
每组输出只有一行,包含一个整数,表示最多能拦截多少枚导弹。
样例输入
8
300 207 155 300 299 170 158 65
样例输出
6
解答
解题思路
1,最多能击落多少颗导弹:将第i枚导弹作为最后一枚导弹,最多能击落多少颗,在下面代码中该值定义为end[i]
2,计算end[i]:递归思想,当第i颗导弹比i之前的第j颗导弹低的话,end[i]=end[j]+1;在前j颗导弹中取最大值;
代码
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int n;
cin >> n; //导弹数量
int heigh[n]; //导弹高度
int end[n]; //该枚导弹作为最后击落的导弹时最多击落导弹数量
for (int i = 0; i < n; i++)
{
cin >> heigh[i];
end[i] = 1; //只击落该枚导弹总是可行的
}
for (int i = 0; i < n; i++) //依次把每一枚导弹作为最后一枚
{
for (int j = 0; j < i; j++)
{ //将该枚导弹高度依次与前i枚导弹比较
if (heigh[j] >= heigh[i])
{
end[i] = max(end[i], end[j] + 1);
}
}
}
int maxnum = 0; //最大击落数
for (int i = 0; i < n; i++) //遍历求最大击落数
{
if (end[i] > maxnum)
maxnum = end[i];
}
cout << maxnum;
}