【Acwing187】导弹防御系统(LIS+剪枝+贪心+dfs+迭代加深)

news2025/1/4 15:12:43

题目描述

看本文需要准备的知识

1.最长上升子序列(lis)的算法思想和算法模板

2.acwing1010拦截导弹(lis+贪心)题解   本题题解,需要知道这种贪心算法

3.简单了解dfs暴力搜索、剪枝、搜索树等概念

思路讲解

dfs求最小步数有两种方法:记一个全局最小值,迭代加深

bfs的缺点:空间太大、不好剪枝

此处采用dfs的迭代加深

首先,这道题的爆搜思路为:从前往后枚举每颗导弹属于某个上升子序列,还是下降子序列;
如果属于上升子序列,则枚举属于哪个上升子序列(包括新开一个上升子序列);如果属于下降子序列,可以类似处理

那么搜索树就会十分的大,如下所示:

如何剪枝,首先可以采用acwing1010的贪心策略(下面放题解链接),这样就不用遍历插入每一个序列的分支了,而是在上升时(包含插入已有上升序列和新增一个上升序列)或者下降时(包含插入已有下降序列和新增一个下降序列)就确定了要选择哪种分支,而把其它分支全部剪掉!

acwing1010拦截导弹(lis+贪心)题解

优化之后,搜索树就简化为:

 dfs的函数原型设为:

dfs(u,su,sd):

其中u代表现在遍历的序列第几个数,su表示现在上升序列的个数,sd表示现在下降序列的个数

答案res初始化为n(因为最多需要的防御系统的个数就是n)

在dfs的开头也可以做一个小剪枝:

if(su+sd>=res)return;

意思是:如果此次dfs的su+sd大于等于当前已经算出的需要最少的防御系统数量,就直接把这个分支剪掉,因为在这之后su+sd不可能比res小,就不可能在这以下的分支获得更小的res

完整代码

#include<iostream>
using namespace std;
const int N=55;
int res;
int h[N],up[N],down[N];
int n;
void dfs(int u,int su,int sd)
{
    if(su+sd>=res)return;
    if(u==n)
    {
        res=su+sd;
        return;
    }
    int k=0;
    while(k<su&&up[k]>h[u])k++;
    if(k<su)
    {
        int t=up[k];
        up[k]=h[u];
        dfs(u+1,su,sd);
        up[k]=t;
    }
    else
    {
        up[k]=h[u];
        dfs(u+1,su+1,sd);
    }
    k=0;
    while(k<sd&&down[k]<h[u])k++;
    if(k<sd)
    {
        int t=down[k];
        down[k]=h[u];
        dfs(u+1,su,sd);
        down[k]=t;
    }
    else
    {
        down[k]=h[u];
        dfs(u+1,su,sd+1);
    }
}
int main()
{
    while(cin>>n,n)
    {
        for(int i=0;i<n;i++)cin>>h[i];
        res=n;
        dfs(0,0,0);
        cout<<res<<endl;
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VuePress实现自动获取文章侧边栏目录功能

&#x1f468;&#x1f3fb;‍&#x1f4bb; 热爱摄影的程序员 &#x1f468;&#x1f3fb;‍&#x1f3a8; 喜欢编码的设计师 &#x1f9d5;&#x1f3fb; 擅长设计的剪辑师 &#x1f9d1;&#x1f3fb;‍&#x1f3eb; 一位高冷无情的编码爱好者 大家好&#xff0c;我是 DevO…

微信小程序之本地生活(九宫格)

文章目录 一.创建项目二.配置修改json三.编写WXML四.编写WXSS五.最终效果 一.创建项目 创建新的项目&#xff0c;名称为&#xff1a;本地生活 二.配置修改json 在app.json中删除其他页面 将index改为grid 自动生成新的文件 添加自己的轮播图片 源代码&#xff1a; <!--…

Spark Streaming与流处理

1.流处理 1.1 静态数据处理 在流处理之前,数据通常存储在数据库,文件系统或其他形式的存储系统中。应用程序根据需要查询数据或计算数据。这就是传统的静态数据处理架构。Hadoop 采用 HDFS 进行数据存储,采用 MapReduce 进行数据查询或分析,这就是典型的静态数据处理架构。…

c++视觉---使用轨迹条设置图片的对比度,亮度

轨迹条&#xff1a;cv::createTrackbar cv::createTrackbar 是OpenCV库中的一个函数&#xff0c;用于创建一个图形用户界面 (GUI) 中的滑动条控件&#xff0c;允许用户在应用程序运行时调整特定参数的值。这个函数的调用方式如下&#xff1a; int cv::createTrackbar(const s…

69名学员通过!9月份,誉天红帽RHCE学员再创佳绩!

9月份&#xff0c;誉天又有69名学员通过了RHCE认证&#xff0c;让我们和他们一起分享这份喜悦&#xff0c;继续努力前行&#xff01; ▲部分红帽学员留影▲ 学习并不是一场速度比赛&#xff0c;而是一场毅力与坚持的较量。每个人都有自己的学习节奏和方式&#xff0c;重要的是找…

【快速入门】JVM之类加载机制与Native

感慨&#xff1a; 如何定义一个合格的Java程序员&#xff0c;Java程序员要了解掌握哪些知识点&#xff0c;网上的面试题太多了&#xff0c;后端需要了解掌握的知识点太多太多了&#xff0c;Java基础、数据结构、异常、多线程、Spring、Spring boot、事务、算法、数据库&#xf…

python对excel数据表进行数据清洗

当拿到excel表&#xff0c;使用python对excel操作前&#xff0c;第一件事情是对excel表的数据进行数据清洗。 数值是否有空值&#xff0c;是否有重复的数据&#xff0c;把以上2个问题解决完成以后&#xff0c;才是对数据真正操作的开始。 1、使用pandans读取数据 2、判断exce…

安装hadoop,并配置hue

0、说明 对于大数据学习的初始阶段&#xff0c;我也曾尝试搭建相应的集群环境。通过搭建环境了解组件的一些功能、配置、原理。 在实际学习过程中&#xff0c;我更多的还是使用docker来快速搭建环境。 这里记录一下我搭建hadoop的过程。 1、下载hadoop 下载地址&#xff1a;…

2023年中国智慧医院市场现状及行业发展趋势分析[图]

自&#xff12;&#xff10;&#xff11;&#xff19;年开始&#xff0c;国家卫健委首次提出了智慧医院这一概念ꎬ并明确提出包含的三个方面&#xff0c;即:一是智慧医疗方面&#xff0c;主要面向医院所有医务人员使用者&#xff0c;以深层次提升医院信息化建设为目标ꎬ规范参照…

2023年中国连锁麻辣烫市场发展趋势分析:连锁麻辣烫行业规模将持续增长[图]

连锁麻辣烫即以连锁模式经营的麻辣烫。麻辣烫源自巴蜀地区&#xff0c;后经过市场从业者的改良推广&#xff0c;已经成为一种表现形式丰富多样的中式快餐。可根据连锁麻辣烫门店连锁模式的不同&#xff0c;将连锁麻辣烫门店分为直营连锁麻辣烫和加盟连锁麻辣烫。 连锁麻辣烫行…

无痛入门Prometheus:一个强大的开源监控和告警系统,如何快速安装和使用?

一、前生今世 Prometheus 是完全开源的系统监控和告警工具包&#xff0c;它受 Google 内部的 BorgMon 监控系统启发&#xff0c;由前Google 工程师从 2012 年开始在 SoundCloud 以开源软件的形式进行研发&#xff0c;自此以后&#xff0c;许多公司和组织都采用了Prometheus 作为…

Docker学习笔记 - 极简极入门级

Docker学习笔记 - 极简极入门级 文章目录 Docker学习笔记 - 极简极入门级前言架构命令docker pulldocker pushdocker imagesdocker rmidocker rundocker stop/start/restartdocker rmdocker psdocker execdocker logsdocker save/loaddocker inspectdocker builddocker network…

2023年中国香樟木家具行业分析:定制化和个性化的需求不断增加[图]

香樟木是一种常见的木材&#xff0c;它在家具行业中被广泛使用。香樟木家具行业定义是指使用香樟木材料制造的家具产品的生产、销售和相关业务活动。 香樟木家具行业分类 资料来源&#xff1a;共研产业咨询&#xff08;共研网&#xff09; 香樟木家具的生产主要集中在少数大型…

vue-slot插槽

作用&#xff1a;让父组件可以向子组件中任意位置插入html结构&#xff0c;也是组件通信方式的一种&#xff0c;适用于父组件》子组件 分类: 默认插槽、具名插槽、作用域插槽 定义子组件时使用slot组件&#xff0c;在使用子组件是可以决定是否插入具体的html代码 默认插槽 如…

Survey on Cooperative Perception in an Automotive Context 论文阅读

论文链接 Survey on Cooperative Perception in an Automotive Context 0. Abstract 本文就协同基础设施领域提供相关环境的调查回顾了感知中涉及的主要模块&#xff1a;定位&#xff0c;目标检测和跟踪&#xff0c;地图生成提供了协同感知的 SWOT 1. Intro 无人驾驶汽车的背…

万宾荣获深圳应博会“全球应急产业先锋奖”创始人发表峰会演讲

今年5月&#xff0c;住房和城乡建设部表示将全面启动的城市基础设施生命线安全工程工作&#xff0c;通过各类智能感知设备等数字化手段&#xff0c;及早发现和管控城市燃气、桥梁、供水、排水防涝等领域的风险隐患&#xff0c;切实提高城市安全保障能力、维护人民生命财产安全&…

基于SpringBoot的足球联赛管理系统

基于SpringBoot的足球联赛管理系统 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首页 详情 管理员界面 摘要 基于Spring Boot的足球联赛管理系统代表了一种现代体育赛事管…

这15个海运提单的雷区 你知道吗?

海运提单中英文对照 海运提单主要项目填制说明 1、托运人(Shipper)&#xff1a;即与承运人签订运输契约&#xff0c;委托运输的货主&#xff0c;即发货人。在信用证支付方式下&#xff0c;一般以受益人为托运人;托收方式以托收的委托人为托运人。另外&#xff0c;根据《UCP500》…

【uniapp】subnvue组件数据更新视图未更新问题

背景 : 页面中的弹窗使用了subnvue来写, 根据数据依次展示一个一个的弹窗, 点击"关闭"按钮关闭当前弹窗, 显示下一个弹窗 问题 : 当点击关闭时( 使用的splice() ), 数据更新了 , 而视图没有更新, 实际上splice() 是不仅更新数据, 也可以更新视图的 解决 : this.$fo…

Linux配置JAVA_HOME

[rootlocalhost ~]# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 22.04.3 LTS Release: 22.04 Codename: jammy1.下载jdk 官网下载地址 2.将下载好的软件包解压到指定目录 tar -zxf /usr/local/software/jdk-…