算法学习系列(五十):最长上升子序列模型(二)

目录

  • 引言
  • 一、最长上升子序列 II
  • 二、拦截导弹
  • 三、导弹防御系统

引言

本章内容讲的是最长上升子序列模型的第二种,基本模型还是以最长上升子序列的优化方法是一个思想,其实还是比较的难想的,并且其序列单调性还是要好好的注意一下,只有台下认真琢磨透,并且写的足够熟练那么考场上才会如鱼得水,加油!


一、最长上升子序列 II

标签:贪心

思路:朴素版的最长上升子序列的时间复杂度是 O ( N 2 ) O(N^2) O(N2) 的,该数据 N ≤ 1 0 5 N \leq 10^5 N105 ,所以就会超时,就得对其进行优化,采用的是贪心的策略,时间复杂度: O ( N ⋅ l o g N ) O(N\cdot logN) O(NlogN)。如果一个数列为 3 , 1 , . . . . . . 3,1,...... 3,1,...... ,那么能接在 3 3 3 的后面的数,就可以接到 1 1 1 的后面去,并且 1 1 1 还要更好更兼容一些,所以存储 3 3 3 就是没有必要的了。我们可以用一个数组来存储长度为下标的上升子序列的最后一个数是多大,那么这个数肯定是越小越好,然后我们遍历一个数的时候,要求以该数结尾的最长上升子序列最长是多少,首先该数可以放在任意结尾小于该数的后面,然后我们需要放在小于 a [ i ] a[i] a[i] 的最大值的后面,这相当于是一个节省资源的方法,也就是选择满足条件最接近该数的一个序列。因为长度越长结尾的数就会越大,所以要放到满足条件的最长的后面,就是以 a [ i ] a[i] a[i] 为结尾的最长上升子序列的最长值。那么如果放到后面,那么更新的就是下一个长读的结尾元素了。

题目描述:

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式
第一行包含整数 N。第二行包含 N 个整数,表示完整序列。输出格式
输出一个整数,表示最大长度。数据范围
1≤N≤100000,−109≤数列中的数≤109
输入样例:
7
3 1 2 1 8 5 6
输出样例:
4

示例代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 1e5+10;int n;
int a[N];
int g[N], len;int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);cin >> n;for(int i = 0; i < n; ++i) cin >> a[i];for(int i = 0; i < n; ++i){int l = 0, r = len;while(l < r){int mid = l + r + 1 >> 1;if(g[mid] < a[i]) l = mid;else r = mid - 1;}g[r+1] = a[i];len = max(len, r+1);}cout << len << endl;return 0;
}

二、拦截导弹

标签:DP、线性DP、最长上升子序列

思路:首先第一问就是求一个最长不上升子序列的最大值,因为数据范围为 N ≤ 1000 N \leq 1000 N1000 ,所以直接拿朴素版的也能过。然后第二问可以简化为至少要多少个不上升子序列才能把有个的序列覆盖掉,这个其实就是求最长上升子序列的个数,因为肯定存在一个最长上升子序列,使得这里面的每一个导弹都必须要新开一个组才能满足条件,所以这是最小的需要满足的组数。还有一种方法,就是一种贪心的策略,就是跟上一题差不多,就是我们只存每一个组的末尾元素的值,首先这个元素值按照长度从小到大肯定是单调递增的,大家可以先假设为递增的,然后插入一个元素看看是否可以维持递增就可以了。然后插入的元素肯定是要大于等于该元素的最小值,相当于找到最接近该数的序列,然后用二分去做即可。上一题求的是上升子序列最长是多少,这题第二问求的是不上升子序列最短是多少,是一个对偶问题。

题目描述:

某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少
导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。输入格式
共一行,输入导弹依次飞来的高度。输出格式
第一行包含一个整数,表示最多能拦截的导弹数。第二行包含一个整数,表示要拦截所有导弹最少要配备的系统数。数据范围
雷达给出的高度数据是不大于 30000 的正整数,导弹数不超过 1000。输入样例:
389 207 155 300 299 170 158 65
输出样例:
6
2

示例代码1:贪心

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 1010;int n;
int h[N], f[N], g[N];int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);while(cin >> h[n]) n++;int r1 = 0, r2 = 0;for(int i = 0; i < n; ++i){f[i] = g[i] = 1;for(int j = 0; j < i; ++j){if(h[i] <= h[j]) f[i] = max(f[i], f[j] + 1);else g[i] = max(g[i], g[j] + 1);}r1 = max(r1, f[i]);r2 = max(r2, g[i]);}cout << r1 << endl << r2 << endl;return 0;
}

示例代码2:贪心做法

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 1010;int n;
int h[N], f[N];
int g[N], cnt;int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);while(cin >> h[n]) n++;int res = 0;g[0] = -1;for(int i = 0; i < n; ++i){f[i] = 1;for(int j = 0; j < i; ++j){if(h[i] <= h[j]) f[i] = max(f[i], f[j] + 1);}res = max(res, f[i]);int l = 1, r = cnt;while(l < r){int mid = l + r >> 1;if(g[mid] >= h[i]) r = mid;else l = mid + 1;}if(g[r] >= h[i]) g[r] = h[i];else g[++cnt] = h[i];}cout << res << endl << cnt << endl;return 0;
}

三、导弹防御系统

标签:搜索、深度优先搜索、DFS、迭代加深、贪心

思路:这道题我们只能暴力枚举了,要么加入到上升子序列里,要么加入到下降子序列里,优化的方法就是只存每个序列的最后一个元素值,插入是一种贪心:插入到上升子序列里小于它的最大值和下降子序列里的大于它的最小值里,单调性分别为单调递减和单调递增,然后用暴搜即可。

题目描述:

为了对抗附近恶意国家的威胁,R 国更新了他们的导弹防御系统。一套防御系统的导弹拦截高度要么一直 严格单调 上升要么一直 严格单调 下降。例如,一套系统先后拦截了高度为 3 和高度为 4 的两发导弹,那么接下来该系统就只能拦截高度大于 4 的导弹。给定即将袭来的一系列导弹的高度,请你求出至少需要多少套防御系统,就可以将它们全部击落。输入格式
输入包含多组测试用例。对于每个测试用例,第一行包含整数 n,表示来袭导弹数量。第二行包含 n 个不同的整数,表示每个导弹的高度。当输入测试用例 n=0 时,表示输入终止,且该用例无需处理。输出格式
对于每个测试用例,输出一个占据一行的整数,表示所需的防御系统数量。数据范围
1≤n≤50
输入样例:
5
3 5 2 4 1
0 
输出样例:
2
样例解释
对于给出样例,最少需要两套防御系统。一套击落高度为 3,4 的导弹,另一套击落高度为 5,2,1 的导弹。

示例代码:

#include <bits/stdc++.h>using namespace std;typedef long long LL;
typedef pair<int,int> PII;
#define x first
#define y secondconst int N = 55;int n;
int a[N];
int up[N], down[N];
int ans;void dfs(int u, int p, int q)
{if(p + q >= ans) return;if(u == n){ans = p + q;return;}int k = 0;while(k < p && up[k] >= a[u]) k++;if(k < p) {int t = up[k];up[k] = a[u];dfs(u+1,p,q);up[k] = t;}else {up[k] = a[u];dfs(u+1,p+1,q);}k = 0;while(k < q && down[k] <= a[u]) k++;if(k < q) {int t = down[k];down[k] = a[u];dfs(u+1,p,q);down[k] = t;}else {down[k] = a[u];dfs(u+1,p,q+1);}
}int main()
{ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);while(cin >> n, n){for(int i = 0; i < n; ++i) cin >> a[i];ans = n;dfs(0,0,0);cout << ans << endl;	}return 0;
}

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

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

相关文章

【YOLOv9】实战二:手把手教你使用TensorRT实现YOLOv9实时目标检测(含源码)

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f384;所属专栏&#xff1a;『LabVIEW深度学习实战』 &#x1f4d1;上期文章&#xff1a;『【YOLOv9】实战一&#xff1a;在 Windows 上使用LabVIEW OpenVINO工具…

CTF工具处理(2)--HackBar报错

来源&#xff1a;HackBar插件绕许可_hackbar许可证-CSDN博客 报错页面&#xff1a; 工具报错原因&#xff1a; 版本升级&#xff0c;需要收费。 破解&#xff1a; 1.下载文件&#xff08;去网上找破解HackBar&#xff09; 2.添加附件&#xff1a; 3.重启&#xff1a; 按F12就…

引领4G拾音新时代:DuDuTalk双定向拾音设备上市,助力现场管理步入智能化

近日&#xff0c;继DuDuTalk的4G智能拾音工牌&#xff08;挂牌和胸牌&#xff09;之后&#xff0c;赛思云科技在线下沟通场景智能语音采集方案领域的又一突破性产品4G双定向桌面拾音终端全新上市。 该产品是面向营业网点、市政大厅、医疗诊室、售票窗口、贵宾室等环境的柜台服…

【工具-pip】

工具-pip ■ pip-工具■ pip-安装■ pip-卸载■ pip-帮助■ pip- 批量安装库■ 批量卸载库■ 提高pip下载速度 ■ pip-工具 pip 是 Python 标准库中的一个包&#xff0c;这个包是用来管理 Python 第三方库。 通用的 Python 包管理工具。提供了对 Python 包的查找、下载、安装、…

cesium 动态线效果

一、扩展材质 function PolylineTrailMaterial(options) {options Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT);this._definitionChanged new Cesium.Event();// 变量初始化this.color Cesium.defaultValue(options.color && new Cesium.Colo…

基于区间预测的调度方法

《基于区间预测的光伏发电与蓄电池优化调度方法》 为了应对县级市光伏发电与用电需求之间的最优调度问题&#xff0c;提出一种面向蓄电池和光伏发电机的区间预测调度优化方法。该方法分别对发电功率调度、充电/放电功率调度和荷电状态调度进行决策从而获得最优调度的精确范围。…

Python Flask Web框架快速入门

Flask 入门Demo Flask 开发环境搭建&#xff0c;执行如下指令&#xff1a; pip install flask # 第一节: Flask 快速入门from flask import Flask app Flask(__name__)app.route(/flask) def hello_flask():return Hello Flaskapp.run() 核心代码剖析&#xff1a; 从 fla…

RTSP/Onvif视频监控平台EasyNVR如何提高匿名用户的用户名和密码安全性?

EasyNVR安防视频云平台是旭帆科技TSINGSEE青犀旗下支持RTSP/Onvif协议接入的安防监控流媒体视频云平台。平台具备视频实时监控直播、云端录像、云存储、录像检索与回看、告警等视频能力&#xff0c;能对接入的视频流进行处理与多端分发&#xff0c;包括RTSP、RTMP、HTTP-FLV、W…

Nginx+Lua+OpenResty(详解及使用)

一、 Nginx简介 Nginx是一个高性能的Web服务器和反向代理的软件。 Web服务器&#xff1a;就是运行我们web服务的容器&#xff0c;提供web功能&#xff0c;还有tomcat也提供类似的功能。 代理是软件架构和网络设计中&#xff0c;非常重要的一个概念。 二、Nginx的反向代理&…

flutter 谷歌的苹果系统消息推送

flutter firebase 云消息通知教程 (android-安卓、ios-苹果) Android、ReactNative、Flutter集成Firebase推送注意事项 Android&#xff1a;Firebase 凭据 iOS&#xff1a;基于 p8 令牌的 APN 连接 iOS&#xff1a;p12 生成证书 Flutter之对接国外推送onesignal踩坑笔记&a…

0.C++入门(专栏前言)

目录 1.什么是C 2.C的发展史 3.C的重要性 应用&#xff1a; 4.如何学习C 5.关于本专栏 1.什么是C 20世纪80年代&#xff0c;计算机界提出oop(object oriented programming:面向对象&#xff09;思想&#xff0c;支持面向对象的程序设计应运而生。 1982年&#xff0c;本…

Java实现文件分片上传、大文件秒传

Java实现文件分片上传、大文件秒传&#xff0c;大文件如何做断点续传&#xff1f;JAVAWEB 文件上传及下载&#xff0c;JAVA大文件上传&#xff0c;大文件下载解决方案&#xff0c;JAVA实现文件分片上传并且断点续传&#xff0c;JAVA大文件分片上传/多线程上传功能&#xff0c;超…

JS-47-Node.js06-fs模块-读写文件

Node.js内置的fs模块就是文件系统模块&#xff0c;负责读写文件。 和所有其它JavaScript模块不同的是&#xff0c;fs模块同时提供了异步和同步的方法。 一、回顾&#xff1a;异步方法VS同步方法 1-1、异步方法 因为JavaScript的单线程模型&#xff0c;执行IO操作时&#xff…

STP学习的第一篇

1.STP的基本概念&#xff1a;根桥 &#xff08;1&#xff09;STP的主要作用之一是在整个交换网络中计算出一棵无环的“树”&#xff08;STP树&#xff09;。 &#xff08;2&#xff09;根桥是一个STP交换网络中的“树根”。 &#xff08;3&#xff09;STP开始工作后&#xf…

【C++类和对象】初始化列表与隐式类型转换

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

《C语言深度解剖》(8):一篇文章彻底学会Visual Studio 调试技巧,新手必看!

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&am…

MySQL 基础语法(2)

文章目录 创建表查看表修改表表数据插入 本文为表结构相关的基础语言库相关的基础语句 创建表 CREATE TABLE table_name ( field1 datatype comment xxx, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;CREATE TABLE&#xff1…

NLP(2)--搭建简单的模型(nn)

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 可能使用到的包 可以通过Anaconda直接install&#xff0c;不行就PIP install xxx PythonTorchTransformersScikit-learnNumpyGensimPandas 我的版本&#xff1a; 可以用 conda list 查看 代码 如果有包导入不进来&…

如何搭建私域获取淘宝店铺卖家订单信息trade.fullinfo.get

私域流量主要由已经对企业或品牌感兴趣并进行关注的用户组成&#xff0c;这些用户对企业具有一定的忠诚度和粘性。通过与这些用户建立良好的互动和关系&#xff0c;企业可以进一步提升用户的忠诚度和转化率&#xff0c;从而有助于建立持续稳定的业务模式和盈利模式&#xff0c;…

【ARFoundation自学01】搭建AR框架+检测平面+点击克隆立方体到地面=自信入门!

介绍 AR 的功能其实是个大手机系统厂商和眼镜设备厂商开发的功能&#xff0c;并不是Unity的功能&#xff0c;毕竟Unity没有自己的手机设备&#xff01;比如谷歌公司的安卓开发了ARcore&#xff0c;让所有安卓8.0版本以上的用户能够在手机上体验AR功能&#xff01;苹果推出了AR…