【DP】拦截导弹

本文介绍了如何使用动态规划(DP)解决一个导弹拦截问题。该问题要求计算一套导弹拦截系统最多能拦截多少导弹,以及拦截所有导弹至少需要多少套系统。通过求解最长上升子序列和最长不下降子序列,可以得出答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

p1020

题目

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。

输入导弹依次飞来的高度(雷达给出的高度数据是 \le 50000≤50000的正整数),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入

1行,若干个整数(个数 \le 100000≤100000)

输出

2行,每行一个整数,第一个数字表示这套系统最多能拦截多少导弹,第二个数字表示如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。

输入样例

389 207 155 300 299 170 158 65

输出样例

6
2

分析

这道题思路简单,一个最长上升子序列和一个最长不下降子序列跑一遍就ok了。

最长上升子序列

最长不下降子序列相对于最长上升子序列只需要小小地改动一下就可以了

代码

#include<iostream>
using namespace std;
int t, n;
int a[1001000];
int dp[1001000];
int d[100100
### 关于拦截导弹的算法 在讨论拦截导弹的问题时,可以将其分为两类:一类是在游戏中模拟导弹追踪的行为;另一类则是基于特定约束条件下的最优解求解问题。 #### 游戏中的导弹追踪算法 在游戏中实现导弹追踪功能通常涉及调整导弹的角度以使其逐渐接近目标。这一过程可以通过不断更新导弹的方向向量来完成[^1]: ```python def update_missile_direction(current_position, target_position): direction_vector = [target_position[i] - current_position[i] for i in range(len(current_position))] # 归一化方向向量 magnitude = sum([component ** 2 for component in direction_vector]) ** 0.5 normalized_direction = [direction_vector[i] / magnitude for i in range(len(direction_vector))] return normalized_direction ``` 此方法适用于二维或三维空间内的简单追踪逻辑,在实际应用中可能会加入更多物理特性如加速度、阻力等因素。 #### 拦截导弹的最大数量与所需系统的最小数目 对于给定一系列导弹高度的情况,存在一个经典问题是确定单个拦截系统能够成功击毁的最大连续下降序列长度以及覆盖全部攻击所需的最少拦截装置的数量。这类题目往往采用动态规划的方法解决[^3][^4]: 假设`heights[]`表示按时间顺序记录的一系列导弹的高度,则定义状态转移方程如下: - `dp[i]`: 表示从前i枚导弹中选出最长不升子序列(即满足条件h[j]>=h[k], j<k<=i) 的最大长度; 初始状态下设置`dp[0]=1`, 对每一个新的元素遍历之前的所有位置寻找符合条件的最大值并加1赋给当前索引处. 最终结果保存在一个数组里,其中最大的那个就是第一个输出; 而第二个输出则等于整个序列划分成若干严格单调递减部分后的总数目. ```python def max_intercept_and_min_system(heights): n = len(heights) dp = [1]*n for i in range(n): for j in range(i): if heights[j] >= heights[i]: dp[i] = max(dp[i], dp[j]+1) longest_sequence_length = max(dp) min_system_count = 0 used_heights = set() while heights: highest_index = max((v,i) for i,v in enumerate(heights))[1] temp_highest = heights[highest_index] while temp_highest not in used_heights and any(temp_highest>=x for x in heights): used_heights.add(temp_highest) try: next_index = heights.index(max(x for x in heights if x <= temp_highest)) temp_highest = heights[next_index] except ValueError: break min_system_count += 1 filtered_heights = [] for h in heights: if h not in used_heights: filtered_heights.append(h) heights = filtered_heights[:] return (longest_sequence_length, min_system_count) ``` 上述代码实现了两个主要功能——计算单一拦截器可捕获的最大导弹链长度(`longest_sequence_length`) 和 完全防护所有来袭威胁所需要的最低配置数(`min_system_count`).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值