拦截导弹(动态规划)
ALGO-13VIP 算法训练 拦截导弹
问题描述
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:
虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。
某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹,
如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。
输入格式
一行,为导弹依次飞来的高度
输出格式
两行,分别是最多能拦截的导弹数与要拦截所有导弹最少要配备的系统数
样例输入
389 207 155 300 299 170 158 65
样例输出
6
2
从刷题以来,总是能听到说这题动态规划能更省时间,能算出来,但我好像从来没有了解啥是动态规划,然后我自己粗略的认识了一下动态规划,顺带以自己的能力总结一下。
所谓的动态规划 ,说白了就是类似数列,举个例子:我们知道一串数字2 4 6 8 10这样的一串,很显然一串等比数列,公比为2,那么,给你一个10,是不是能推出来下一位是20,是不是不用知道前面是啥,我只要知道我前面是10,那么我就知道我要求的是20。所以动态规划的捷径就在于我利用我之前算出来的值,来算下面我要求的值,不必再从头循环又算一遍,可以省掉大量的时间。
那么我们可以借着动态规划来思考一下上面的题目,这道题目就是希望能够求出一台设备能打到多少导弹,也就是说需要找出最长的一串依次下降的数字。那我是不是可以这么想,先把所有的高度都记为1,表示这高度我要打,我必然能打掉。
然后我们一个一个开始比较,当然是从第二个高度开始,如果比前面的矮,那么我就+1,说明打到这颗207的地方,必然我可以打掉两个,155这个地方又+1,也就是说打到这颗155的地方,我必然可以选择打掉三个
是不是有动态规划内味儿了,如果我知道能打到207这个高度,那么我肯定能打到155这个高度,也就是说,我已经知道207这个高度已经打掉2个了,那155这个高度只要是前面那个高度+1就好了,至于389这个高度已经可以不管了。
然后!到了300这个地方就不一样了,比之前的高度要高,所有,如果我要打300,那么我只能打389和300,也就是说如果我要打300,我只能够打到2颗
接下来又判断299这个高度,我们发现和之前相比,389可以+1,207不行,155不行,300可以,那么就是389,300,299,那么299只要在300基础上+1即可,也就是说,我知道300是打掉2颗,那么我到299就必然是三颗,后面158,65也是如此。
最后成果就是: