拦截导弹问题
题目内容:
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,并观测到导弹依次飞来的高度,请计算这套系统最多能拦截多少导弹。拦截来袭导弹时,必须按来袭导弹袭击的时间顺序,不允许先拦截后面的导弹,再拦截前面的导弹。
输入格式:
第一行,输入雷达捕捉到的敌国导弹的数量k(k<=25),第二行,输入k个正整数,表示k枚导弹的高度,按来袭导弹的袭击时间顺序给出,以空格分隔。
输出格式:
输出只有一行,包含一个整数,表示最多能拦截多少枚导弹。
输入样例:
8
300 207 155 300 299 170 158 65
输出样例:
6
算法思想
首先我们要明确动态规划法的思想:
将问题分解为若干子问题,前面一子问题的解可以为后面一子问题的求解提供信息。在求解任一子问题时,列出所有可能的局部解,通过比较保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,直到最后一个子问题就是初始问题的解。
带入到当前问题中就是将问题分解为从最后一个导弹向前算出从当前导弹开始拦截可拦截的导弹数,这样先算出的导弹可以为后面算出的导弹提供信息,直到算出所有导弹,输出最大值即可。
具体算法解释:
建立一个num[]数组保存从第n个导弹开始拦截最多可以拦截的导弹数。num[n] = 1从最后一个导弹开始拦截则拦截数为1。之后的每个导弹可拦截数等于后面比他高度低的导弹中可拦截数最大的拦截数+1。即有两个条件:1.高度比他低,2.拦截数最大,然后+1。列好表后输出num中最大的数即可。
## 源代码:
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#define MAXNUM 25
using namespace std;
//返回数组中最大的元素
int myMax(