AcWing 1014. 登山JAVA(最长单调子序列 单调栈)

最长上升子序列**----线性DP,贪心,单调栈 因为由于贪心的思想,存在这种替换方式,导致最长上升子序列中某些值被替换掉,但是上升子序列的长度没有发生改变,只有里面的值发生了变化,因此,在求解该题中最长上升子序列的长度时可以被使用,但是要输出最长上升子序列的值的时候,就不行了。核心就是因为栈中储存的不只有一个序列,是旧序列和新序列合并的产物,因此不一定是最终最长上升子序列。 阅读详情

时间复杂度:

O(nlogn)

//单调栈问题
//分别计算从左向右和从右向左的最长上升子序列,分别存储到两个数组中
import java.util.*;
 
class Main{
    static int n = 0, N = 1010;
    static int[] nums = new int[N];
    static int[] left = new int[N], right = new int[N];
    static int bs(int[] max, int len, int num){//找到从左到右第一个大于num的数字
        int l = 0, r = len;
        while(l < r){
            int mid = l + r >> 1;//+1防止mid不变造成死循环。
            if(max[mid] < num)l = mid + 1;
            else r = mid;
        }
        return l;
    }
    public static void main(String[] args)throws Exception{
        Scanner sc = new Scanner(System.in);
        int m = sc.nextInt();
        for(int i = 1; i <= m; ++i)nums[i] = sc.nextInt();
        int[] st = new int[N];//单调栈
        int tt = -1;
        for(int i = 1; i <= m; ++i){
            if(tt == -1)st[++tt] = nums[i];
            if(tt >= 0 && st[tt] > nums[i]){
                int index = bs(st, tt, nums[i]);
                st[index] = nums[i];
            }
            if(st[tt] < nums[i])st[++tt] = nums[i];
            left[i] = tt + 1;
        }
        tt = -1;
        for(int i = m; i >= 1; --i){
            if(tt == -1)st[++tt] = nums[i];
            if(tt >= 0 && st[tt] > nums[i]){
                int index = bs(st, tt, nums[i]);
                st[index] = nums[i];
            }
            if(st[tt] < nums[i])st[++tt] = nums[i];
            right[i] = tt + 1;
        }
        int max = 0;
        for(int i = 1; i <= m; ++i){
            max = Math.max(max, left[i] + right[i] - 1);
        }
        System.out.print(max);
        
    }
}

 

夜深人静写算法(二十)- 最长单调子序列 一类简单动态规划问题 阅读详情

相关推荐

【硬核指南/MI50 32G/Ubuntu】从零部署大模型:MI50显卡Ubuntu系统驱动安装与避坑全记录

本文详细记录了在Ubuntu系统上为AMD MI50显卡安装驱动并部署大模型的完整流程,包括硬件兼容性检查、BIOS关键设置、系统安装优化、ROCm驱动安装及常见问题解决方案。特别针对MI50显卡在X99平台上的特殊配置需求提供了实用技巧,帮助用户避免常见陷阱,提升大模型训练效率。

weixin_42520909的博客 805

单调栈原理+练习

首先用一道题引出单调栈首先画一个图演示山的情况:最暴力的做法自然是O(n方)的双循环遍历,这么做的思想是求出当前山右侧有多少座比它小的山,遇见第一个高度大于等于它的就停止。但是对于我们所求的答案数,可以换一个想法,对于5;7可以看到它。对于3;7,5可以看到它。对于4;7,5可以看到它。可以发现,即求左侧有多少比当前值大的山的个数,那么我们可以维护一个数据结构,使得每次加进来一个数,都保持递减的顺序,然后每次加入前,都计算它的size大小,进行累加。比如:一开始7进入;

ouliten的博客 850

视频动作识别、行为识别、时空动作检测数据集整理(持续更新)

动作、行为、事件 在计算机视觉的相关研究中,人体的动作、行为识别是一个基础研究问题。但目前识别、检测人类的动作/行为仍然是一个巨大的挑战。这里整理下当前相关的细分任务、数据集和开源代码(持续更新中)。

人工智能算法与工程实践 3万+

【动态规划】最长单调子序列

详细讲解如何设计一个O(n2)的算法实现查询最长单调子序列

Coco416的博客 1731

滤波算法-呼吸心跳信号检测方法(四)

呼吸心跳信号检测系列文章:信号滤波处理

yjh_2019的博客 6269

上、下拉电阻(定义、强弱上拉、常见作用、吸电流、拉电流、灌电流)

1.上、下拉电阻定义 上拉电阻是把一个信号通过一个电阻接到电源(Vcc),下拉电阻是一个信号通过一个电阻接到地(GND)。 2.强上拉、弱上拉 强上拉、弱上拉的强弱只是上拉电阻的阻值不同,没有什么严格区分。例如:50Ω上拉,一般成为强上拉;100kΩ上拉则称为弱上拉。下拉也是一样的。强拉电阻的极端就是0Ω电阻,即将信号线直接与电源或低相连接。 3.上、下拉电阻的作用 因为上下拉电阻的作用概念很宽泛,不用领域的使用方法也不同,常见使用方法整理如下: ...

小浪宝宝的博客 3万+

最长上升子序列(贪心 + 二分 + 单调栈)

给定一个长度为 的数列,求数值严格单调递增的子序列的长度最长是多少。 输入:第一行为,第二行是长度为的序列 数据范围: ,数列中的数 数据范围很大,我们不能用dp解决,于是我们有个贪心的做法: 建立一个栈,遍历整个序列,若当前的a[i]大于栈顶元素,则直接压入栈中.否则,二分查找栈中第一个大于等于他的数的位置,并把它替换掉.最后栈中的元素的数量就是最长的上升子序列的长度. 证明:1.显然,当前元素大于栈顶元素时压入栈中是在构造单调上升序列. 2.若当前元素小于等于栈顶元素 ①若第一个大..

CK1513710764的博客 935

基于OpenCV的围棋终局识别与胜负判定系统实现

计算机视觉是人工智能领域的关键技术,它使计算机能够从数字图像或视频中获取、处理和分析信息。其核心原理在于通过图像处理算法提取特征,并基于这些特征进行识别、分类和测量。在工程实践中,计算机视觉技术为自动化、智能化应用提供了强大支持,广泛应用于工业检测、自动驾驶、医疗影像分析等领域。本文聚焦于一个具体的应用场景:利用OpenCV库实现围棋终局识别。通过图像预处理、棋盘检测与透视校正、交叉点定位等步骤,结合围棋规则逻辑,构建了一套从棋盘图像自动判定胜负的解决方案。该方案涉及自适应二值化、霍夫变换、连通域分析等关键

weixin_29100927的博客 279

经典DP-最长单调子序列

最长递增子序列的个数 知识点 Arrays.fill(count, 1); 是 Java 中的一个方法调用,用于将数组 的所有元素设置为指定的值,即 。这个方法来自于 类,是一个静态工具类,提供了很多用于操作数组(例如排序、搜索、填充等)的静态方法。在这个特定的情境下, 被用来初始化 数组。由于我们正在计算最长递增子序列的个数,每个元素至少可以作为一个长度为 1 的递增子序列的结束元素。因此, 数组的每一个位置都被设置为 ,意味着每个元素开始时都被视为一个独立的递增子序列。

qq_73886051的博客 568

camera——HAL层知识分享

CameraHAL层是Android相机系统的核心中间层,负责连接Framework层与硬件驱动层。它通过标准化接口解耦软硬件,实现跨平台兼容性,同时为厂商提供硬件定制空间。主要功能包括:设备管理、数据流处理、参数控制以及图像优化。关键子系统涵盖预览、拍照、录像、对焦与曝光等模块,采用HAL3的"请求-响应"模型实现精细控制。性能优化重点关注启动时间、帧率稳定性和延迟控制。通过分层架构设计(接口层-核心层-适配层)和缓冲池机制,确保高效数据传输和硬件资源调度。

2302_77429403的博客 2072

从药企研发视角:如何用GNN提升分子水溶性预测准确率?PyTorch+ESOL全案例

本文从药企研发的实际需求出发,详细介绍了如何利用图神经网络(GNN)技术,结合PyTorch框架和ESOL数据集,构建并优化分子水溶性预测模型。通过完整的代码案例,深入探讨了分子图数据处理、GNN架构设计、超参数调优以及模型评估与解释等关键环节,旨在帮助研发团队提升预测准确率,从而更高效地筛选和优化候选药物分子。

weixin_29054399的博客 292

最长上升子序列(经典DP、单调栈优化)

输入一个序列,求最长上升子序列(LIS)。 小数据 输入 第1行:1个整数n(1<=n<=5000),表示序列中元素的个数. 第2行-n+1行:每行1个整数x(-1000<=x<=1000),第i+1行表示序列中的第i个元素。 输出 第1行:1个整数k,表示最长上升子序列的长度。 思路: 深搜是行不通的,广搜也是行不通的,两者...

DD(XYX)的硫氰化氘博客 1923

搞懂 ABAP 里的 Language Settings:登录语言、文本环境语言与 sy-langu 的真实含义

SAP系统中语言设置并非单一字段决定,而是由登录语言(logon language)和文本环境语言(text environment language)共同控制。登录语言在会话期间固定,而文本环境语言可通过SET LOCALE语句修改,影响文本处理、排序、异常显示等行为。开发中需区分两者:使用CL_ABAP_SYST方法获取登录语言,通过sy-langu或GET LOCALE获取当前文本环境语言。语言环境切换应谨慎处理并尽快恢复,避免影响会话中其他程序。在多语言场景下,正确处理语言设置对确保文本相关功能正常

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1307

最长单调子序列(动态规划)

最长上升子序列(Longest Increasing Subsequence),简称LIS,也有些情况求的是最长非降序子序列,二者区别就是序列中是否可以有相等的数。 例如: 对于序列(1, 7, 3, 5, 9, 4, 8),我们就会得到一些上升的子序列,如(1, 7, 9), (3, 4, 8), (1, 3, 5, 8)等等,而这些子序列中最长的(如子序列(1, 3, 5, 8) ),它的长...

weixin_44350170的博客 601

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

最长递增子序列

问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为6的数组A{5, 6, 7, 1, 2, 8},则其最长的单调递增子序列为{5,6,7,8},长度为4. 解法1:最长公共子序列法 这个问题可以转换为最长公共子序列问题。如例子中的数组A{5,6, 7, 1, 2, 8},则我们排序该数组得到数组A‘{1, 2, 5, 6, 7,...

切梦 5418

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

专题:最长单调子序列(LIS)问题

专题:最长单调子序列(LIS)问题 (4.27 记录) LIS问题是DP当中的一个很经典的问题。 LIS问题的核心在于状态的保护和转移。 一.LIS的长度 解法1:一般DP 时间复杂度O(n2) 很显然,对于某一个点i,1-i的最长单调子序列是唯一的,而以i结尾的最长单调子序列也是唯一的。这样就有两种思路: A dp[i]表示1-i中出现的最长单调子序列的长度; B dp[i]表示以i结尾的最长单调子序列的长度。 这两种思路唯一的区别在于dp是否要转移,或者更直观的来说,区别在于dp[n]是否就是最长单调子

eliyou的博客 1238

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

最长单调递增子序列的三种解法

从报名蓝桥杯开始我就觉得我走入了一条及其坑的路。 从大一到大三我写过的代码,思考过的算法真是少之又少,一个动态规划我依旧没有吃透,真的是觉得好有挫败感。不过还好,一点点来。 既然知道自己要去做这件事情,就认真去做吧。就算开始的比较晚但是能学到东西就很好。 这是转载自爱天涯技术论坛。http://qiemengdao.iteye.com/blog/1660229 解释

艾米栗的代码天地 2042

最长公共子序列LCS和 最长单调子序列 及其二分优化

最长公共子序列LCS和最长上升子序列LIS都是动态规划的经典例题,再度回顾这两个例题,已经有了更深一些的理解和优化方式。这里系统整理一下 。 一.最长单调子序列 1.最长上升子序列 最朴素的dp思路,就是对一个序列a[i],设一个dp数组, 其中dp[i]的含义为以a[i]结尾的最长上升子序列的长度。 那么我们考虑当前的a[i]与与a[i]之前的元素的关系, 如果当前的a[i]与a[i]之前的a[j]满足递增关系,那么dp[i]的状态可以由dp[j]得到,对每个先前状态取最值即为当前状态的最.

m0_60777643的博客 2618

最长单调子序列(DP)

问题描述:给定某一组无序的数,求其中最长的单调序列的长度(该单调序列不一定是连续的),如在 5 6 1 2 4 7 5 中最长上升增序列是1 2 4 7 或者1 2 4 5。 该题可以用动态规划的方法解决,时间复杂度为O(n^2): 设A[t]表示序列中的第t个数,F[t]表示从1到t这一段中以t结尾的最长上升子序列的长度。 动态规划方程:F[t]=max{1,F[j]+...

weixin_33953384的博客 211

算法日记40:最长上升子序列LIS(单调栈优化)n*log^n

最长上升子序列LIS(单调栈优化)n*log^n

Erik_LinX的博客 1466

poj 怪盗基德的滑翔翼

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33991727的博客 767

P1439 【模板】最长公共子序列 (最长上升子序列+单调栈)

P1439 【模板】最长公共子序列 (最长上升子序列优化)题目描述给出1-n的两个排列P1和P2,求它们的最长公共子序列。输入输出格式输入格式:第一行是一个数n,接下来两行,每行为n个数,为自然数1-n的一个排列。输出格式:一个数,即最长公共子序列的长度输入输出样例输入样例#1: 复制5 3 2 1 4 51 2 3 4 5输出样例#1: 复制3说明【数据规模】对于50%的数据,n≤1000对于1...

碳酸钙的01妖精的博客 857

浅谈单调栈的应用

单调栈的应用 在刚接触单调栈的时候,我们在做了几道入门题后可能会对单调栈有一定的了解,但是却有点难以归纳说出单调栈到底适用于什么题目(或者在遇到什么类型的题目时我们要想到用单调栈),我刚开始也百思不得其解,但在后面将几道相关题目一一对比之后,我忽然对单调栈的应用有了更深的理解。 1.单调栈的特点: 1.后进先出 1.单调性:单调栈中存储的所有元素一定是单调增或减的。 2.单调栈的作用归纳: 1.在一个序列中,求最长上升子序列 1.在一个序列中,求以某一个元素为最小值或最大值的最大区间长度。(区

weixin_52896784的博客 301

最长单调子序列

最长单调子序列 1. 问题描述(HDU 1160)     给出一些老鼠的质量和速度, 求一串数据证明老鼠的质量和速度成反比例关系? 2. 算法介绍     首先排序(由小到大), 第一关键字“质量”, 第二关键字“速度“     最长单调子序列方法:         Len(i)表示使证明成立的某串数据最后一只老鼠是第 i 只老鼠的该串长度。         对于第i + 1 只

CodingEveryday 712

最长上升子序列(O(nlogn))

最长上升子序列的解法(O(nlogn)) 实现

sdau20163940的博客 994

《最长单调子序列》基础概念

本文介绍了一种求解最长递增子序列的高效算法,采用动态规划思想结合贪心策略和二分查找进行优化。算法维护一个辅助数组存储递增子序列的最小末尾元素,通过二分查找确定每个元素的插入位置,时间复杂度为O(n log n),优于传统O(n²)的DP方法。文章详细讲解了算法思路、伪代码实现、处理流程和复杂度分析,并举例说明其正确性。该算法在生物信息学、数据压缩等领域有广泛应用,是处理大规模数据的有效解决方案。

英雄哪里出来 1001
上一篇: AcWing 1017. 怪盗基德的滑翔翼(最长上升子序列,单调栈)
下一篇: AcWing 482. 合唱队形(最长上升子序列 单调栈)
AARM
博客等级 码龄10年 10粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值