【例6.4】拦截导弹问题(Noip1999)

这个问题可以使用动态规划来解决。我们需要找到最小的系统数量,以拦截所有导弹。每一套系统都需要满足条件:第一发炮弹能够到达任意的高度,但之后每一发炮弹的高度都不能超过前一发。

我们可以使用两个数组:dp1dp2dp1[i] 表示拦截前 i 个导弹所需的最少系统数,并且考虑第 i 个导弹作为新的一套系统的最高点。dp2[i] 则表示拦截前 i 个导弹时,最后一个系统的最高点所能达到的最大高度。

算法步骤:

初始化 dp1dp2 为无穷大,除了dp1[0]=0 (没有导弹时不需要系统)。
遍历每一个导弹的高度h[i]
对于每个 i,再次遍历之前的导弹高度 h[j](j 从 0 到 i-1)。
如果 h[j] >= h[i],则考虑将第 i 个导弹放入以第 j 个导弹为最高点的系统中。此时,dp1[i] 的值更新为 min(dp1[i], dp1[j] + 1),同时更新 dp2[i] h[i]
如果 h[j] < h[i],则第 i 个导弹必须作为新的一套系统的最高点,此时 dp1[i] 的值更新为 min(dp1[i], dp1[j]),并且 dp2[i] 保持不变(因为 h[i] 是新系统的最高点)。
最终答案即为 dp1[n],其中 n 是导弹的数量。

以下是 C++ 代码实现:

#include <iostream>  
#include <vector>  
#include <algorithm>  
#include <climits>  
  
using namespace std;  
  
int main() {  
    int n;  
    cin >> n;  
    vector<int> h(n);  
    for (int i = 0; i < n; ++i) {  
        cin >> h[i];  
    }  
  
    vector<int> dp1(n, INT_MAX), dp2(n, 0);  
    dp1[0] = 1; // 初始状态,一个导弹需要一套系统  
  
    for (int i = 1; i < n; ++i) {  
        dp1[i] = dp1[i - 1] + 1; // 初始化,假设每个导弹都需要新的系统  
        for (int j = 0; j < i; ++j) {  
            if (h[j] >= h[i]) {  
                if (dp1[j] + 1 < dp1[i]) { // 发现更优解  
                    dp1[i] = dp1[j] + 1;  
                    dp2[i] = h[i]; // 更新最高点  
                }  
            } else {  
                // h[j] < h[i],考虑将h[i]作为新系统的最高点  
                if (dp1[j] < dp1[i]) { // 发现更优解  
                    dp1[i] = dp1[j];  
                }  
            }  
        }  
    }  
  
    cout << dp1[n - 1] << endl; // 输出最小系统数  
    return 0;  
}

这段代码可以处理题目中提到的拦截导弹问题,并输出最小需要的系统数。注意,由于题目中导弹高度不超过 30000,因此 INT_MAX 足以作为 dp 数组的初始值。如果导弹高度更大,可能需要使用 long long 类型来存储 dp 数组的值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558013.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css设置文字撑满盒子

效果如上&#xff1a; <div style"width: 250px;background-color:red;text-align-last:justify;word-break: keep-all;">为中国崛起而读书</div>

【Linux】文件描述符——万字详解

目录​​​​​​​ 前言 预备知识 复习C语言的文件接口 写方式打开文件 追加方式打开文件 读方式打开文件 系统的文件接口 open close write read 文件描述符 0 & 1 & 2 理解文件描述符 文件描述符的分配规则 重定向的本质 dup2 理解Linux下一切…

Go 单元测试基本介绍

文章目录 引入一、单元测试基本介绍1.1 什么是单元测试&#xff1f;1.2 如何写好单元测试1.3 单元测试的优点1.4 单元测试的设计原则 二、Go语言测试2.1 Go单元测试概要2.2 Go单元测试基本规范2.3 一个简单例子2.3.1 使用Goland 生成测试文件2.3.2 运行单元测试2.3.3 完善测试用…

存储过程的使用(一)

目录 不带参数的存储过程 创建一个存储过程&#xff0c;向数据表 dept 中插入一条记录 带 IN 参数的存储过程 在存储过程中接受来自外部的数值&#xff0c;在存储过程中判断该数值是否大于零并显示 输入一个编号&#xff0c;查询数据表emp中是否有这个编号&#xff0c;如果…

博客系统项目测试(selenium+Junit5)

在做完博客系统项目之后&#xff0c;需要对项目的功能、接口进行测试&#xff0c;利用测试的工具&#xff1a;selenium以及Java的单元测试工具Junit进行测试&#xff0c;下面式测试的思维导图&#xff0c;列出该项目需要测试的所有测试用例&#xff1a; 测试结果&#xff08;全…

【Tesla T4为例】GPU安装最新版本NVIDIA Driver、CUDA、cuDNN、Anaconda、Pytorch

NVIDIA Driver 进入英伟达官网下载页面 按照以上方式选择即可得到>535.113.01版本的驱动&#xff0c;可以实现多卡推理&#xff0c;小于这个版本会导致多卡训练以及推理报错 虽然最新版本为550.54.15&#xff0c;但是535版本更加稳定&#xff0c;并且pytorch目前只支持到1…

云渲染采用了哪些核心技术来实现其高效的计算的?

云渲染运用云计算技术&#xff0c;将3D渲染任务分配至远程服务器集群以实现高速高效渲染&#xff0c;释放本地资源&#xff0c;缩短了影视动画、效果图等的制作周期&#xff0c;在影视、建筑、游戏等行业发挥关键作用。哪云渲染都用了哪些技术呢&#xff1f;我们一起来看看。 …

2024新版淘宝客PHP网站源码

源码介绍 2024超好看的淘客PHP网站源码&#xff0c;可以做优惠券网站&#xff0c;上传服务器&#xff0c;访问首页进行安装 安装好了之后就可以使用了&#xff0c;将里面的信息配置成自己的就行 喜欢的朋友们拿去使用把 效果截图 源码下载 2024新版淘宝客网站源码

UE5下载与安装

官方网站&#xff1a;https://www.unrealengine.com/zh-CN 1、下载启动程序安装包。 登录官网后&#xff0c;点击首页右侧下载按钮下载Epic Games启动程序的安装包&#xff0c;如下图&#xff1a; 2、安装启动程序。 双击步骤1所下载安装软件&#xff0c;如下图&#xff1a;…

一个开箱即用的物联网项目,开源免费可商用

一、平台简介 今天给大家推荐一款开源的物联网项目&#xff0c;简单易用&#xff0c;非常适合中小团队和个人使用&#xff0c;项目代码和文档完全开源&#xff0c;个人和公司都可以应用于商业项目&#xff0c;只需要保留开源协议文件即可。 本项目可应用于智能家居、农业监测…

Jmeter测试学习笔记

第一章 jmeter基础知识 一.Jmeter工具中的组件 1.测试计划&#xff1a;Jmeter测试的起点。容器。 2.线程组&#xff1a;代表一定的用户 3.取样器&#xff1a;发送请求的最小单元 4.逻辑控制器&#xff1a;处理请求逻辑 5.前置处理器&#xff1a;请求之前的操作 6.后置处…

算法课程笔记——pair的使用

先思考&#xff0c;为什么 STL 中的容器和算法都是用的左闭右开区间&#xff1f; | | | 这样迭代器只需要支持和!(或者<或者)操作就可以方便的进行区间遍历了。 其它区间设置的话&#xff0c;要么得支持<操作&#xff0c;要么得在循环体内&#xff0c;操作之前进行!判定。…

Proxmox VE 实现批量增加多网络

前言 实现批量创建多网络&#xff0c;更改主机名称&#xff0c;hosts解析 初始化网卡&#xff0c;主机名称&#xff0c;hosts解析&#xff0c;重启网卡 我的主机六个网卡&#xff0c;使用的有四个网卡&#xff0c;以下一键创建和初始化主机名称我是以硬件的SN号最为主机的名…

【InternLM 实战营第二期作业04】XTuner微调LLM:1.8B、多模态、Agent

基础作业 训练自己的小助手认知 1.环境安装 安装XTuner 源码 # 如果你是在 InternStudio 平台&#xff0c;则从本地 clone 一个已有 pytorch 的环境&#xff1a; # pytorch 2.0.1 py3.10_cuda11.7_cudnn8.5.0_0studio-conda xtuner0.1.17 # 如果你是在其他平台&#x…

[NISACTF 2022]huaji?

注意要加--run-asroot

第四百六十七回

文章目录 1. 知识回顾2. 使用方法3. 示例代码4. 内容总结 我们在上一章回中介绍了"OverlayEntry组件简介"相关的内容&#xff0c;本章回中将介绍OverlayEntry组件的用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中介绍了Overlay…

高通 Android 12 源码编译aidl接口

最近在封装系统sdk接口 于是每次需要更新aidl接口 &#xff0c;传统方式一般使用make update-api或者修改Android.mk文件&#xff0c;今天我尝试使用Android.bp修改 &#xff0c;Android 10之前在Android.mk文件修改&#xff0c;这里不做赘述。下面开始尝试修改&#xff0c;其实…

CTFHub(web sql注入)(二)

布尔盲注 盲注原理&#xff1a; 将自己的注入语句使用and与?id1并列&#xff0c;完成注入 手工注入&#xff1a; 爆库名长度 首先通过折半查找的方法&#xff0c;通过界面的回显结果找出数据库名字的长度&#xff0c;并通过相同的方法依次找到数据库名字的每个字符、列名…

ROS 2边学边练(29)-- 使用替换机制

前言 启动文件用于启动节点、服务和执行流程。这组操作可能有影响其行为的参数。替换机制可以在参数中使用&#xff0c;以便在描述可重复使用的启动文件时提供更大的灵活性。替换是仅在执行启动描述期间评估的变量&#xff0c;可用于获取特定信息&#xff0c;如启动配置、环境变…

2024年哪一款洗地机好用?四大热门主流机型分享

传统的拖地方式必须是拖一会就得清洗一遍拖把&#xff0c;如果房屋面积大&#xff0c;中途得经历无数次换清水的过程&#xff0c;而且拖地是得频繁得弯腰用力气&#xff0c;顽固的污渍还需要来回反复拖几遍&#xff0c;甚至要蹲下身子手动抹布清洁&#xff0c;真的是费时费力。…
最新文章