最长不下降子序列详解

最长不下降子序列LIS详解 阅读详情

 解决的问题:给定一个序列,求最长不下降子序列的长度(nlogn的算法没法求出具体的序列是什么)

 

  定义:a[1..n]为原始序列,d[k]表示长度为k的不下降子序列末尾元素的最小值,len表示当前已知的最长子序列的长度。

  初始化:d[1]=a[1]; len=1; (0个元素的时候特判一下)

  现在我们已知最长的不下降子序列长度为1,末尾元素的最小值为a[1],那么我们让i从2到n循环,依次求出前i个元素的最长不下降子序列的长度,循环的时候我们只需要维护好d这个数组还有len就可以了。

  关键问题就是怎么维护?

  可以看出我们是要用logn的复杂度维护的。实际上利用了d数组的一个性质:单调性。(长度更长了,d[k]的值是不会减小的)

  考虑新进来一个元素a[i]:

  如果这个元素大于等于d[len],直接让d[len+1]=a[i],然后len++。这个很好理解,当前最长的长度变成了len+1,而且d数组也添加了一个元素。

  如果这个元素小于d[len]呢?说明它不能接在最后一个后面了。那我们就看一下它该接在谁后面。

    准确的说,并不是接在谁后面。而是替换掉谁。因为它接在前面的谁后面都是没有意义的,再接也超不过最长的len,所以是替换掉别人。那么替换掉谁呢?就是替换掉那个最该被它替换的那个。也就是在d数组中第一个大于它的。第一个意味着前面的都小于等于它。假设第一个大于它的是d[j],说明d[1..j-1]都小于等于它,那么它完全可以接上d[j-1]然后生成一个长度为j的不下降子序列,而且这个子序列比当前的d[j]这个子序列更有潜力(因为这个数比d[j]小)。所以就替换掉它就行了,也就是d[j]=a[i]。其实这个位置也是它唯一能够替换的位置(前面的替了不满足d[k]最小值的定义,后面替换了不满足不下降序列)

  至于第一个大于它的怎么找……STL upper_bound。每次复杂度logn。

 

  至此,我们就神奇的解决了这个问题。按照这个思路,如果需要求严格递增的子序列怎么办?

  仍然考虑新进来一个元素a[i]:

  如果这个元素大于d[len],直接让d[len+1]=a[i],然后len++。这个很好理解,当前最长的长度变成了len+1,而且d数组也添加了一个元素。

  如果这个元素小于等于d[len]呢?说明它不能接在最后一个后面了。那我们就看一下它该接在谁后面。

    同样的道理,只是upper_bound的时候要特判一下。每次复杂度logn。

 

//最长不下降子序列nlogn  Song 

#include<cstdio>
#include<algorithm>
using namespace std;

int a[40005];
int d[40005];

int main()
{
    int n;
    scanf("%d",&n);
    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    if (n==0)  //0个元素特判一下 
    {
        printf("0\n");
        return 0;
    }
    d[1]=a[1];  //初始化 
    int len=1;
    for (int i=2;i<=n;i++)
    {
        if (a[i]>=d[len]) d[++len]=a[i];  //如果可以接在len后面就接上 
        else  //否则就找一个最该替换的替换掉 
        {
            int j=upper_bound(d+1,d+len+1,a[i])-d;  //找到第一个大于它的d的下标 
            d[j]=a[i]; 
        }
    }
    printf("%d\n",len);    
    return 0;
}

最长不下降子序列问题 DP最大不下降子序列前几天看了关于动态规划的内容,基本上讲的都是最大不下降序列,所以第一次博客 就写这个东西了。 最基本模板给出一系列的数,给出一个整数,即最长不下降子序列(code vs 1567) 题解:先另创一个数组,用来记录某一个数到目前为止的最大长度,用for语句将所有元素遍历 一遍就可以确定最长不下降子序列的长度了。 比如给出:21 22 63 15 从63开始(15不需要, 阅读详情

相关推荐

【2026年得物春招算法岗- 3月21日 -第三题- 爬山】(题目+思路+Java&C++&Python解析+在线测试)

本文摘要: 题目要求从编号递增的景点序列中选出最长"先不下降、后不上升"的子序列。通过动态规划结合树状数组优化,可以高效求解。具体步骤为:1)离散化景点高度;2)从左到右用树状数组计算每个位置结尾的最长不下降子序列长度;3)从右到左计算每个位置开头的最长不上升子序列长度;4)合并结果,取left[i]+right[i]-1的最大值。该方法时间复杂度为O(nlogn),适用于大规模数据。样例输入9个景点高度[2,7,3,5,4,9,1,8,6]时,最优解为6(2,3,4,9,8,6)。

m0_73659489的博客 341

动态规划之最长不下降子序列

一、概念明确 先来看一串数字:(20,17,19,22,4,7,10,12,5,2,13) 1.序列:像以上排成一列的数字,我们叫它序列,其中每个数字,可以被称为一个元素。 2.子序列:将序列中的部分元素或者全部元素取出后构成的一个新序列,我们称为子序列。 例:将元素 17,22,6,7 取出来构成一个新序列(17,22,6,7),那么它就是一个子序列 注意:子序列是有序的,不能将后面的元素写在前面。比如写成(22,17,6,7)这种。 3.不下降子序列:不下降的意思是上升或者相...

xiaoxi_hahaha的博客 1万+

生物信息学避坑指南:Scissor算法参数alpha和cutoff的黄金设置法则

本文深入解析了生物信息学中Scissor算法的关键参数alpha和cutoff的黄金设置法则,帮助研究者有效整合bulk RNA与单细胞数据,识别单细胞亚群。通过实战验证的调参策略,避开常见陷阱,获得可靠的生物学发现,特别适用于肿瘤异质性研究和免疫细胞分型等场景。

weixin_33734785的博客 450

最长不下降子序列LIS

设有由n个不相同的整数组成的数列,记为: a(1)、a(2)、……、a(n)且a(i)<>a(j) (i<>j).例如3,18,7,14,10,12,23,41,16,24。若存在i1<i2<i3<… < ie且有a(i1)<a(i2)<… <a(ie)则称为长度为e的不下降序列。如上例中3,18,23,24就是一个长度为4的不下降序列,同时也有3,7,10,12,16,24长度为6的不下降序列。程序要求,当原数列给出之后,求出最长的不下降序列。

Lucas55555555的博客 2416

UE5 中 Python 编程:Python 代码加载到 UE5 中,如何供蓝图节点调用

配置 python 代码的路径,使 UE5 启动时,加载代码文件。重启之后,在蓝图中右键,就能搜索到你定义的方法了。参数为 str 字符串类型,返回值为 向量数组。注意:一定要 重启 UE5。

topcss的专栏 3996

从安装Eclipse 开始 开发第一个 CDS View

一篇超级简单快速的 创建CDS VIEW 入门步骤介绍文章。

IT小职员 4248

最长不下降子序列详解(一)

由2019年字节跳动第二次笔试开始学习,第一部分参考:最长不下降子序列nlogn以及输出序列,作者Milky-Way 1、最长不下降子序列-复杂度为 对于普通的最长不下降子序列,每个数都要从头开始遍历,复杂度 ,只能处理 以内的数据。 代码为:   2、复杂度为 利用序列的单调性。   对于任意一个单调序列,如 1 2 3 4 51 2 3 4 5 (是单增的),若这时向序列尾...

hi_baymax的博客 3万+

FPGA实现电机转速PID控制

通过纯RTL实现电机转速PID控制,包括电机编码器值读取,电机速度、正反转控制,PID算法,卡尔曼滤波,最终实现对电机速度进行控制,使其能够渐近设定的编码器目标值。

STATEABC的博客 7470

【专题】最长不下降序列(LIS)

最长不下降序列(LIS)详解

WillHou的博客 873

记一次springboot集成海康威视SDK过程

一开始没有接触过物联网这块,走了很多弯路,后面还是自己一点点摸索出来的。有个项目,需要对海康的门禁设备进行集成,后台统一管理设备,进行设备人脸数据的下发、删除等操作。3.我还接入了门禁设备的事件监听,门禁所有的事件都会上报到后台服务,这块代码有需要的可以找我。在linux系统中,sdk我使用的是绝对路径,把Linux版本的文件放到服务时,Acs文件夹下的 各个Manage都有现成的代码,可以根据自己的需要调用即可。路径也不要有中文,切记!2.sdk的存放路径不要有中文,不然会出现很多奇怪的问题。

huang_xiaoen的博客 2348

【语音识别算法】深度学习语音识别算法与传统语音识别算法的区别、对比及联系

深度学习语音识别算法与传统语音识别算法在理论基础、实现方式、性能表现等方面存在显著区别,同时也有一些联系。下面将从几个方面详细比较这两种方法,并给出应用实例和代码示例。

weixin_51306394的博客 2566

最长不下降序列(C++)

最长不下降序列(C++)

m0_59850318的博客 2458

基于ESP32的智能停车场管理系统开发

智能停车场管理系统通过引入物联网(IoT)技术,实现对停车场内车辆的实时监控、空闲车位的管理、车辆的入场与出场控制等功能,大大提高了停车场的利用率和管理效率。通过集成物联网技术、云平台以及先进的传感器和执行器,系统不仅能实时监控停车场的车位状态,还能提供更好的用户体验。本文将介绍如何基于ESP32开发一个智能停车场管理系统,涵盖系统架构、硬件选择、软件开发以及最新技术的应用,帮助开发者实现高效的智能停车管理。ESP32的代码主要负责处理车位传感器的数据,控制LED指示灯的状态,以及与云平台进行数据交互。

2201_76125393的博客 910

求序列最长不下降子序列_最长不下降子序列nlogn算法详解

今天花了很长时间终于弄懂了这个算法……毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ这篇文章是在懂了这个问题n^2解决方案的基础上学习。解决的问题:给定一个序列,求最长不下降子序列的长度(nlogn的算法没法求出具体的序列是什么)定义:a[1..n]为原始序列,d[k]表示长度为k的不下降子序列末尾元素的最小值,len表示当前已知的最长子序列的长度。初始化:d[1]=a[1];...

weixin_39667626的博客 848

ESP32-IDF开发之旅 外设篇④ 串口通信 Uart

ESP32-S3 UART串口通信详解 本文介绍了ESP32-S3的UART串口通信配置流程,涵盖硬件引脚分配、参数设置、数据收发等关键步骤。

单片机菜鸟哥的博客 495

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最长不下降子序列nlogn算法详解

很赞的讲解,建议移步至原博文地址支持博主:http://www.cnblogs.com/itlqs/p/5743114.html 原博文: 今天花了很长时间终于弄懂了这个算法……毕竟找一个好的讲解真的太难了,所以励志我要自己写一个好的讲解QAQ     这篇文章是在懂了这个问题n^2解决方案的基础上学习。     解决的问题:给定一个序列,求最长不下降子序列的长度(nl

077CYW的博客 2072

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

《算法笔记》动态规划

目录概念什么是动态规划动态规划的递归写法和递推写法最优子结构分治与动态规划的区别贪心与动态规划的区别无后效性最大连续子序列和 概念 什么是动态规划 动态规划,是一种用来解决一类最优化问题的算法思想。动态规划的思想就是将一个大问题转化为若干个子问题,但是子问题必须具有重复子问题和无后效性,不然就是分治了;此外动态规划问题还必须满足最优子结构和重复子问题。 每求出一个子问题就把这个子问题的结果保存下来...

hjyp的博客 426

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

关于动态规划的一些个人学习和看法

以前一直只是接触过动态规划相关的内容,但是从未系统学习过,所以这一次来做一个系统的总结。   一、概述 动态规划和递归,分治思想,贪心类似,但是又不同。 动态规划之所以特殊不同,是因为所有可以使用动态规划解决的问题都会涉及到两个特点: 1.具有重叠子问题; 2.具有最优子结构; 所谓重叠子问题,就是指在能够将整个大问题进行整体性分割之后,小问题可以互相联系和互相解决。这是和分治思想最...

InNoVaion_yu的博客 372

DAG上最长不下降子序列:结合图论与动态规划的GESP七级精讲

最长不下降子序列(LIS)是动态规划中的经典问题,其核心在于通过维护一个状态数组,高效地找出序列中最长的单调非递减子序列。其原理通常基于贪心与二分查找,将时间复杂度优化至O(n log n),在数据处理和算法设计中具有重要价值。当此问题与图论结合,特别是在有向无环图(DAG)的路径权值序列中求解时,便衍生出更具挑战性的复合问题。这要求算法不仅考虑序列的单调性,还需兼顾图的拓扑结构,是检验对动态规划状态设计理解深度的绝佳场景。通过将LIS的结尾权值作为状态维度,并利用权值范围小的特点进行优化,可以在O(n+m

weixin_32821533的博客 291

最长不下降子序列

什么是最大不下降子序列? 给出一系列的数,在这个序列中求一个子序列,这个子序列是递增的(可以相等)。其中最长的子序列就是最长不下降子序列。 例如下面的序列: 2 2 4 1 5 5 6 3 1 1 5 6 最大不下降子序列为: 2 2 5 5 6 6 其长度为6 动态规划(DP)求最大不下降子序列: #include<iostream> #include<math.h>...

化身孤岛的鲸o的博客 360

最长不下降子序列1

前言 “洗澡中,请勿打扰,偷窥请购票,个体四十,团体八折!”好了,先不洗澡了,嘟嘟老师今天来讲一下——诶等一下,嘟嘟老师还没穿内裤呢,等一分钟…… 啊,终于换好了,开始讲吧。 欢迎来到嘟嘟课堂。今天,嘟嘟老师给大家讲一个比较水的专题,也是被众多信息学爱好者所研究、追求的一个东东——最长不下降子序列!!!大家应该知道我们学校(纪中)的Farmer John(也就是在US

刘嘟嘟的博客 503

数据结构算法设计——动态规划——最长不下降子序列LIS

数据结构算法设计——动态规划——最长不下降子序列LIS

给你糖ya的博客 1557
上一篇: 带括号的式子求值 五种运算符
下一篇: 【gzoi】队列专题杂
Wyt_code
博客等级 码龄9年 10粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值