蓝桥杯 算法训练 拦截导弹 动态规划(java详解)

拦截导弹(动态规划)

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也是如此。
在这里插入图片描述
最后成果就是:

  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
拦截导弹问题,是一个经典的动态规划问题。问题描述如下: 有一套导弹拦截系统,可以拦截任何高度的导弹。但是,每次拦截导弹时,只能拦截高度不超过前一次拦截导弹高度的一半的导弹,否则导弹会突破拦截系统。现在,有一批导弹依次飞来,你需要设计一种拦截策略,最大化能够拦截的导弹数量。 这个问题可以用动态规划来解决。我们定义一个数组 dp,其中 dp[i] 表示拦截前 i 个导弹所能够拦截的最大数量。我们可以用以下方法来更新 dp: - dp[0] = 1,表示没有导弹时可以拦截一个高度为无穷大的虚拟导弹。 - 对于 i > 0,我们枚举前 i-1 个导弹的高度 j,如果当前导弹高度小于等于前一个导弹高度的一半,那么我们可以在前 i-1 个导弹的基础上拦截当前导弹,即 dp[i] = dp[j] + 1。 - 如果当前导弹高度大于前一个导弹高度的一半,那么我们只能选择不拦截当前导弹,即 dp[i] = dp[i-1]。 最终,我们可以得到 dp[n],其中 n 表示导弹的总数,dp[n] 表示能够拦截的最大导弹数量。 下面是一个 Python 实现的示例代码: ``` def missile_interception(heights): n = len(heights) dp = [0] * (n + 1) dp[0] = 1 for i in range(1, n+1): dp[i] = 1 for j in range(i-1, -1, -1): if heights[j] >= heights[i-1] // 2: dp[i] = max(dp[i], dp[j] + 1) return dp[n] ``` 这个算法的时间复杂度是 O(n^2),空间复杂度也是 O(n)。在实际应用中,可以通过使用更高效的数据结构和算法来优化时间和空间复杂度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值