关于LIS的优化

news/2024/12/18 19:47:08/文章来源:https://www.cnblogs.com/lwiwi/p/18615749

LIS是动态规划中经典的问题。
首先我们令f[i]表示前i个元素中最长上升(不下降同理)子序列长度,那么我们有:
f[i]=min{f[j] + 1 | a[i] > a[j]}
朴素的算法当中我们在外层枚举1n,内层枚举1i-1来挨个比较转移,这样的时间复杂度是 (O(n^{2}))的。
考虑优化。我们可以在求出当前最长上升子序列时试着储存一下此时的子序列到底是什么。但是请注意,这并不代表储存的序列就是最终答案!
那么我们就可以对于此时储存的子序列使用二分,对于当前的a[i],我们只需要在储存的子序列当中找到第一个大于a[i]的将它变成a[i],因为同样的序列长度的情况下各个元素的值越小对于后面的元素加入序列越有利。如果此时储存的序列中最大值都小于a[i],那么就将序列长度加1并且将a[i]放入队尾即可。
下面感性证明此做法的正确性。前面就已经说过这样储存的子序列并不是最终的最长上升子序列,但是序列长度却是最长上升子序列的长度,这是因为扩张子序列长度操作是在当且仅当a[i]大于此时队尾元素时才发生。而我们使用二分将队列中间的元素替换只是为了使后面的待枚举的元素更有希望入队,这里其实涉及到贪心的思想,前面也解释过,同样的长度当然是元素的值越小越好,因为元素的值越小后面待枚举的元素就更有可能入队,最终的答案一定不小于此时同样长度却各个元素更大的序列答案。

#include<bits/stdc++.h>using namespace std;int n;
int a[100010];
int d[100010];
int len;int main() {cin >> n;for(int i = 1; i <= n;i++) {cin >> a[i];}d[++len] = a[1];for(int i = 2;i <= n;i++) {if(a[i] > d[len]) d[++len] = a[i];else d[upper_bound(d+1,d+1+len,a[i])-d] = a[i];}cout << len;return 0;
}

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

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

相关文章

2024-12-18 17 55 记录 Cambly trip`s summary and wher 1607b517085581159d14fe7750337be7

2024-12-18 17:55 记录 Cambly trip`s summary and where is the next ?https://tingwu.aliyun.com/doc/transcripts/g2y8qevxaayxnbeo?sl=1# 《2024-12-18 17:55 记录 Cambly trip`s summary and where is the next ?》1. 全文摘要 对话讲述了一个人通过使用美好的旅行来…

实验六 模板类、文件I/O和异常处理

1、实验任务一 Complex.hpp#pragma once#include <iostream> #include <stdexcept>// 声明 //////////////////////////////////////////////////// // 复数模板类声明 template<typename T> class Complex { public:Complex(T r = 0, T i = 0);Complex(cons…

免费设计Logo的新神器Slea.ai

使用Slea.ai,你可以在几分钟内设计出专业、高质量的Logo,支持多种场景应用,免费下载,实现自定义设计。品牌打造从未如此轻松!作为一名注重品牌形象的创作者或企业主,你是否苦于设计一款专业又独特的Logo?今天我要向大家推荐一个超级实用的网站——Slea.ai,它是一款免费的…

MOS管的寄生电容

我们经常看到,在电源电路中,功率MOS管的G极经常会串联一个小电阻,几欧姆到几十欧姆不等,那么这个电阻用什么作用呢? 这个电阻的作用有2个作用:限制G极电流,抑制振荡。 限制G极电流MOS管是由电压驱动的,是以G级电流很小,但是因为寄生电容的存在,在MOS管打开或关闭的时…

配置CentOS 7阿里yum源

备份yum源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo_bakvi /etc/yum.repos.d/CentOS-Base.repo# CentOS-Base.repo # # The mirror system uses the connecting IP address of the client and the # update status of each mirror to …

源码信息收集

引子:上一篇主要介绍了与Web架构相关的信息收集,而在Web架构中有一至关重要的一环,那就是源码。Web应用中美观的ui、特色的功能全靠源码来实现,但同样的,几乎绝大多数与Web相关的漏洞都也都与其源码有关。而本篇则介绍几种常见的源码信息收集方式。附:完整笔记目录~ ps:…

标定和定位的关系

手眼标定手眼标定可以利用某真值位置和传感器观测位置对比得到外参。 关联本质上是外参不同引起的看同一外接参照物,认为自身运动轨迹的不同。位置如上观测同一建筑(三角形,上顶点是北方),真实轨迹(左图):是向北直行是在向正前方走世界坐标系->偏置传感器轨迹(中间图…

12.13

实验2 熟悉常用的HDFS操作1.实验目的 (1)理解HDFS在Hadoop体系结构中的角色; (2)熟练使用HDFS操作常用的Shell命令; (3)熟悉HDFS操作常用的Java API。 2. 实验平台 (1)操作系统:Linux(建议Ubuntu16.04或Ubuntu18.04); (2)Hadoop版本:3.1.3; (3)JDK版本:1.…

12.10

实验八:随机森林算法实现与测试一、实验目的 深入理解随机森林的算法原理,进而理解集成学习的意义,能够使用 Python 语言实现随机森林算法的训练与测试,并且使用五折交叉验证算法进行模型训练与评估。 二、实验内容 (1)从 scikit-learn 库中加载 iris 数据集,使用留出法…

Tengine:Nginx二次开发-高性能进化

前言:在当今的互联网时代,Web 服务器的性能和稳定性对于网站的成功至关重要。Nginx 以其高性能和可扩展性而闻名,但有时候,我们需要更多的特性来满足特定的业务需求。Tengine,作为一个由淘宝网发起的 Nginx 二次开发版本,不仅继承了 Nginx 的所有特性,还添加了许多高级功…