C语言专题训练(5)1002 最少拦截系统 【问题描述】 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能超过前一发的高度.某天,雷达捕捉到敌国的导弹来袭.由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹. 怎么办呢?多搞几套系统呗!你说说倒蛮容易,成本呢?成本是个大问题啊.所以俺就到这里来求救了,请帮助计算一下最少需要多少套拦截系统. 【输入形式】 输入若干组数据.每组数据包括:导弹总个数(正整数),导弹依此飞来的高度(雷达给出的高度数据是不大于30000的正整数,用空格分隔) 【输出形式】 对应每组数据输出拦截所有导弹最少要配备多少套这种导弹拦截系统. 【样例输入】 8 389 207 155 300 299 170 158 65
时间: 2024-03-14 13:49:27 浏览: 117
好的,这道题目可以使用动态规划来解决。以下是代码实现:
```c
#include <stdio.h>
#define MAX_N 1000
#define INF 0x3f3f3f3f
int n; // 导弹总个数
int a[MAX_N + 1]; // 导弹依此飞来的高度
int dp[MAX_N + 1]; // dp[i]表示以第i个导弹为结尾的最长不降子序列的长度
int dp2[MAX_N + 1]; // dp2[i]表示以第i个导弹为结尾的最长不升子序列的长度
int max(int a, int b) {
return a > b ? a : b;
}
int min(int a, int b) {
return a < b ? a : b;
}
int solve() {
// 计算最长不降子序列的长度
for (int i = 1; i <= n; i++) {
dp[i] = 1;
for (int j = 1; j < i; j++) {
if (a[j] <= a[i]) {
dp[i] = max(dp[i], dp[j] + 1);
}
}
}
// 计算最长不升子序列的长度
for (int i = 1; i <= n; i++) {
dp2[i] = 1;
for (int j = 1; j < i; j++) {
if (a[j] >= a[i]) {
dp2[i] = max(dp2[i], dp2[j] + 1);
}
}
}
// 计算最终结果
int ans = INF;
for (int i = 1; i <= n; i++) {
ans = min(ans, n - max(dp[i], dp2[i]));
}
return ans;
}
int main() {
while (scanf("%d", &n) != EOF) {
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
}
printf("%d\n", solve());
}
return 0;
}
```
希望能够帮到你!
阅读全文
相关推荐

















