当前位置: 首页 > news >正文

【动态规划】二分优化最长上升子序列

最长上升子序列 II 题解

题目传送门:AcWing 896. 最长上升子序列 II

一、题目描述

给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。

输入格式

  • 第一行包含整数 N
  • 第二行包含 N 个整数,表示完整序列

输出格式

  • 输出一个整数,表示最大长度

数据范围

  • 1 ≤ N ≤ 100000
  • -10⁹ ≤ 数列中的数 ≤ 10⁹

二、题目分析

这道题要求我们找到一个序列中最长的严格递增子序列的长度。与普通的最长上升子序列问题不同,本题的数据范围较大(N ≤ 1e5),因此需要使用优化的算法。

三、解题思路

传统的动态规划解法时间复杂度为O(n²),对于n=1e5的情况会超时。我们需要使用贪心+二分的方法将时间复杂度优化到O(nlogn)。

基本思路是维护一个数组a,其中a[i]表示长度为i+1的上升子序列的最小末尾元素。对于每个元素,我们使用二分查找来确定它应该插入的位置,从而保持数组a的单调性。

四、算法讲解

算法原理

  1. 贪心思想:我们希望上升子序列尽可能长,因此需要让序列上升得尽可能慢,即每次在上升子序列最后加上的数尽可能小。
  2. 单调性:数组a是一个严格递增的数组,这保证了我们可以使用二分查找。
  3. 二分查找:对于每个新元素,如果它大于数组a的最后一个元素,则直接添加到末尾;否则,使用二分查找找到第一个大于等于它的位置并替换。

算法实现步骤

  1. 初始化空数组a和计数器cnt=0
  2. 遍历输入序列中的每个元素x
    • 如果x大于a的最后一个元素,直接添加到a末尾,cnt加1
    • 否则,使用二分查找找到a中第一个大于等于x的位置,并用x替换该位置的值
  3. 最终cnt即为最长上升子序列的长度

例子讲解

以输入样例为例:

7
3 1 2 1 8 5 6

处理过程:

  1. 3 → [3], cnt=1
  2. 1 → [1], cnt=1 (替换3)
  3. 2 → [1,2], cnt=2
  4. 1 → [1,2], cnt=2 (1替换1,无变化)
  5. 8 → [1,2,8], cnt=3
  6. 5 → [1,2,5], cnt=3 (替换8)
  7. 6 → [1,2,5,6], cnt=4

最终结果为4。

五、代码实现

#include <bits/stdc++.h>
using namespace std;
// #define int long long
const int N = 1e5 + 10;
int n;
int a[N];
int cnt = 0, f[N];// STL大法
void solve1()
{cin >> n;for (int i = 1; i <= n; i ++){int x;cin >> x;if (cnt == 0 || a[cnt - 1] < x)a[cnt++] = x;else*lower_bound(a, a + cnt, x) = x; // 使用STL的lower_bound找到第一个≥x的位置并替换}cout << cnt;
}// 手写二分
void solve2()
{cin >> n;for (int i = 1; i <= n; i ++){int x;cin >> x;if (cnt == 0 || a[cnt - 1] < x)a[cnt++] = x;else{int l = -1, r = cnt + 1;while (l + 1 != r) // 二分查找第一个≥x的位置{int mid = l + r >> 1;if (a[mid] < x)l = mid;else r = mid;}a[r] = x; // 替换该位置的值}}cout << cnt;
}signed main()
{ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);// solve1();solve2();return 0;
}

六、重点细节

  1. 初始化边界:二分查找时,左边界设为-1,右边界设为cnt+1,这样可以处理所有可能的情况
  2. 严格递增:题目要求严格递增,因此比较时使用<而不是≤
  3. 替换策略:当找到第一个≥x的位置时,直接替换可以保证后续更长的子序列更容易形成
  4. 数组维护:数组a的长度cnt即为当前找到的最长上升子序列长度

七、复杂度分析

  • 时间复杂度:O(nlogn),每个元素需要进行一次二分查找,二分查找的时间复杂度为O(logn)
  • 空间复杂度:O(n),需要额外的数组a来存储中间结果

八、总结

本题通过贪心+二分的方法,将最长上升子序列问题的时间复杂度从O(n²)优化到O(nlogn),能够高效处理大规模数据。关键在于维护一个单调递增的数组,并通过二分查找来快速确定每个元素的插入位置。

相关文章:

【动态规划】二分优化最长上升子序列

最长上升子序列 II 题解 题目传送门&#xff1a;AcWing 896. 最长上升子序列 II 一、题目描述 给定一个长度为 N 的数列&#xff0c;求数值严格单调递增的子序列的长度最长是多少。 输入格式&#xff1a; 第一行包含整数 N第二行包含 N 个整数&#xff0c;表示完整序列 输…...

MySQL的安装与初始化流程

MySQL概述 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB公司开发&#xff0c;MySQL AB公司被Sun公司收购&#xff0c;Sun公司又被Oracle公司收购&#xff0c;目前属于Oracle公司。 MySQL是目前最流行的关系型数据库管理系统&#xff0c;在WEB应用方面MySQL是最…...

flink standalone集群模式部署

一. 环境准备 1、下载并安装jdk11 2、下载flink 并解压 3、确保服务器之间的免密登录 二、集群搭建 搭建集群至少有三台机器&#xff0c;每台机器的分配角色如下 master: jobManager salve01&#xff1a;taskManager salve02&#xff1a;taskManager 1、在JobManager(…...

Linux线程概念与控制:【线程概念(页表)】【Linux线程控制】【线程ID及进程地址空间布局】【线程封装】

目录 一. 线程概念 1.1什么是线程 1.2分页式存储管理 1.2.1虚拟地址和页表的由来 1.2.2物理内存管理 1.2.3页表 1.2.4页目录结构 1.2.5二级页表地址转换 1.3线程的优点 二.进程VS线程 三.Linux线程控制 3.1POSIX线程库 3.2创建线程 ​编辑 pthread库是个什么东西 …...

7-6 混合类型数据格式化输入

本题要求编写程序&#xff0c;顺序读入浮点数1、整数、字符、浮点数2&#xff0c;再按照字符、整数、浮点数1、浮点数2的顺序输出。 输入格式&#xff1a; 输入在一行中顺序给出浮点数1、整数、字符、浮点数2&#xff0c;其间以1个空格分隔。 输出格式&#xff1a; 在一行中…...

最新全开源码支付系统,赠送3套模板

最新全开源码支付系统&#xff0c;赠送3套模板 码支付是专为个人站长打造的聚合免签系统&#xff0c;拥有卓越的性能和丰富的功能。它采用全新轻量化的界面UI 让您能更方便快捷地解决知识付费和运营赞助的难题&#xff0c;同时提供实时监控和管理功能&#xff0c;让您随时随地…...

Eclipse Leshan 常见问题解答 (FAQ) 笔记

本笔记基于 Eclipse Leshan Wiki - F.A.Q. 页面内容&#xff0c;旨在解答关于 Eclipse Leshan&#xff08;一个开源的 LwM2M 服务器和客户端 Java 实现&#xff09;的常见问题&#xff0c;帮助您更好地理解和使用该工具。 一、Leshan 是什么&#xff0c;我该如何使用它&#x…...

【6】数据结构的栈篇章

目录标题 栈的定义顺序栈的实现顺序栈的初始化入栈出栈获取栈顶元素顺序栈总代码与调试 双端栈的实现双端栈的初始化入栈出栈双端栈总代码与调试 链栈的实现链栈的初始化入栈出栈获取栈顶元素链栈总代码与调试 栈的定义 定义&#xff1a;栈&#xff08;Stack&#xff09;是一种…...

开源虚拟化管理平台Proxmox VE部署超融合

Proxmox VE 是一个功能强大、开源的虚拟化平台&#xff0c;结合了 KVM 和 LXC&#xff0c;同时支持高可用集群、存储管理&#xff08;ZFS、Ceph&#xff09;和备份恢复。相比 VMware ESXi 和 Hyper-V&#xff0c;PVE 具有开源、低成本、高灵活性的特点&#xff0c;适用于中小企…...

C语言基础要素(019):输出ASCII码表

计算机以二进制处理信息&#xff0c;但二进制对人类并不友好。比如说我们规定用二进制值 01000001 表示字母’A’&#xff0c;显然通过键盘输入或屏幕阅读此数据而理解它为字母A&#xff0c;是比较困难的。为了有效的使用信息&#xff0c;先驱者们创建了一种称为ASCII码的交换代…...

函数柯里化(Currying)介绍(一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术)

文章目录 柯里化的特点示例普通函数柯里化实现使用Lodash进行柯里化 应用场景总结 函数柯里化&#xff08;Currying&#xff09;是一种将接受多个参数的函数转换为一系列接受单一参数的函数的技术。换句话说&#xff0c;柯里化将一个多参数函数转化为一系列嵌套的单参数函数。 …...

基于大模型的主动脉瓣病变预测及治疗方案研究报告

目录 一、引言 1.1 研究背景 1.2 研究目的 1.3 研究意义 二、大模型预测主动脉瓣病变原理 2.1 大模型介绍 2.2 数据收集与处理 2.3 模型训练与优化 三、术前预测与评估 3.1 主动脉瓣病变类型及程度预测 3.2 患者整体状况评估 3.3 手术风险预测 四、术中应用与监测…...

VSCode开发者工具快捷键

自动生成浏览器文件.html的快捷方式 在文本里输入&#xff1a; &#xff01; enter VSCode常用快捷键列表 代码格式化&#xff1a;Shift Alt F向上或向下移动一行&#xff1a;Alt Up 或者 Alt Down快速复制一行代码&#xff1a;Shift Alt Up 或者 Shift Alt Down快速保…...

AI助力PPT制作,让演示变得轻松高效

AI助力PPT制作&#xff0c;让演示变得轻松高效&#xff01;随着科技的进步&#xff0c;AI技术早已渗透到各行各业&#xff0c;特别是在办公领域&#xff0c;AI制作PPT已不再是未来的梦想&#xff0c;而是现实的工具。以前你可能需要花费数小时来制作一个完美的PPT&#xff0c;如…...

行业专家视角下的技术选型与任务适配深度解析

行业专家视角下的技术选型与任务适配深度解析 一、任务属性与技术栈的映射逻辑 &#xff08;1&#xff09;学术类项目需优先考虑技术严谨性、可复现性和理论深度&#xff1a; 机器学习模型开发&#xff1a;PyTorchJupyterMLflow形成完整实验闭环&#xff0c;TensorFlow Exte…...

从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.2.1模型偏见与安全对齐(Red Teaming实践)

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 大语言模型全栈开发指南:伦理与未来趋势 - 第五部分:行业应用与前沿探索5.2.1 模型偏见与安全对齐(Red Teaming实践)一、模型偏见的来源与影响1. 偏见的定义与分类2. 偏见的实际影响案例二、安全对齐…...

JUC系列JMM学习之随笔

JUC: JUC 是 Java 并发编程的核心工具包,全称为 Java Util Concurrent,是 java.util.concurrent 包及其子包的简称。它提供了一套强大且高效的并发编程工具,用于简化多线程开发并提高性能。 CPU核心数和线程数的关系:1核处理1线程(同一时间单次) CPU内核结构: 工作内…...

OpenRouter开源的AI大模型路由工具,统一API调用

简介 ‌OpenRouter是一个开源的路由工具‌&#xff0c;它可以绕过限制调用GPT、Claude等国外模型。以下是对它的详细介绍&#xff1a; 一、主要功能 OpenRouter专注于将用户请求智能路由到不同的AI模型&#xff0c;并提供统一的访问接口。它就像一个“路由器”&#xff0c;能…...

3.9/Q2,Charls最新文章解读

文章题目&#xff1a;Association between remnant cholesterol and depression in middle-aged and older Chinese adults: a population-based cohort study DOI&#xff1a;10.3389/fendo.2025.1456370 中文标题&#xff1a;中国中老年人残留胆固醇与抑郁症的关系&#xff1…...

水下图像增强与目标检测:标签缺失的“锅”?

水下图像增强与目标检测&#xff1a;标签缺失的“锅”&#xff1f; 在水下计算机视觉领域&#xff0c;图像增强和目标检测一直是研究热点。然而&#xff0c;一个有趣的现象引起了研究者的关注&#xff1a;在某些情况下&#xff0c;增强后的水下图像用于目标检测时&#xff0c;…...

从扩展黎曼泽塔函数构造物质和时空的结构-13

得到这些数据到底有什么用呢&#xff1f;无非都是振动&#xff0c;只有频率不同。电性振动和磁性振动的正交环绕关系&#xff0c;本质上只是某个虚数单位的平方倍数&#xff0c; 既然如此&#xff0c;我们就可以考虑&#xff0c;把电和磁当成同一种东西。比如通过改变真空介电常…...

Android学习总结之handler源码级

一、核心类关系与线程绑定&#xff08;ThreadLocal 的核心作用&#xff09; 1. Looper 与 ThreadLocal 的绑定 每个线程的 Looper 实例通过 ThreadLocal<Looper> sThreadLocal 存储&#xff0c;确保线程隔离&#xff1a; public final class Looper {// 线程本地存储&…...

多模态学习(八):2022 TPAMI——U2Fusion: A Unified Unsupervised Image Fusion Network

论文链接&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9151265 目录 一.摘要 1.1 摘要翻译 1.2 摘要解析 二.Introduction 2.1 Introduciton翻译 2.2 Introduction 解析 三. related work 3.1 related work翻译 3.2 relate work解析 四…...

adb检测不到原来的设备List of devices attached解决办法

进设备管理器-通用串行总线设备 卸载无法检测到的设备驱动 重新拔插数据线...

探索高通骁龙光线追踪技术

什么是光线追踪&#xff1f; 光线追踪&#xff08;Raytracing&#xff09;是通过模拟现实世界中光线的传播过程并生成更加真实的效果的一种图形渲染技术。 早期在电影&#xff0c;动画&#xff0c;设计等领域已经使用软件摸拟光线追踪来渲染更加真实的图像。一般的做法是从相…...

qRegisterMetaType函数使用

一、有两种形式&#xff1a; 1、int qRegisterMetaType(const char *typeName) template <typename T> int qRegisterMetaType(const char *typeName #ifndef Q_CLANG_QDOC, T * dummy nullptr, typename QtPrivate::MetaTypeDefinedHelper<T, QMetaTypeId2<T&g…...

【北京化工大学】 神经网络与深度学习 实验6 MATAR图像分类

本次实验使用老师发的雷达奇妙数据 实验要求 读取图像形式的MASTAR数据 1、划分数据集为test/train 2、归一化 题目1&#xff1a;定义并训练线性分类器的神经网络 注&#xff1a;本次老师的要求是不限方法&#xff0c;使用pytorch尽可能提升精度 1、准备函数 #本文用的…...

Flutter 的开发环境搭建教程

为了配置Flutter的运行环境&#xff0c;首先我们需要确保你的开发环境支持Flutter&#xff0c;且相关工具都已经安装好。以下是详细的配置步骤&#xff1a; 1. 安装Flutter SDK Flutter是Google推出的用于开发跨平台应用的框架&#xff0c;支持Android、iOS、Web、桌面等多平台…...

MCP:让 AI 应用更聪明,只需几分钟

用 Leonardo.AI 和 FLUX Dev 模型生成&#xff08;作者制作&#xff09; 现在 AI 世界最新的趋势是 MCP&#xff08;模型上下文协议&#xff09;。 如果听起来无聊或者很复杂&#xff0c;别担心 —— 这是个非常简单又有效的工具&#xff0c;可以帮你从零开始构建更好的 AI 智能…...

【编程之路】动态格式化字符串

动态格式化字符串 1.代码功能2.关键组件解析3.完整流程4.示例场景5.注意事项6.典型用途7.总结 &#x1f680; 本文讨论的代码段来自《Python Cookbook》的《2.15.字符串中插入变量》。 针对下面这段代码&#xff0c;我们一起来分析一下。 class safesub(dict):""&qu…...

接收灵敏度的基本概念与技术解析

接收灵敏度是指接收机在特定条件下能够正确提取有效信号的最小输入功率。其技术原理可概括如下&#xff1a;灵敏度主要受热噪声、系统噪声系数及解调所需信噪比共同影响。根据公式(S 10lg(kTB) NF SNR)计算&#xff0c;其中k为玻尔兹曼常数&#xff08;1.3810⁻ J/K&#xf…...

KUKA机器人软件WorkVisual更改语言方法

KUKA机器人的常用的工作软件WorkVisual软件在使用时也可以更改软件操作界面的语言。如果安装时语言没有选择中文&#xff0c;安装完成后也可以进行更改。以下通过WorkVisual 5.0版本进行简单介绍。 一、打开WorkVisual软件5.0版本&#xff1b; 二、在菜单栏选择【Ext…...

图形渲染: tinyrenderer 实现笔记(Lesson 5 - 7)

目录 Lesson 5: Gouraud shadingLesson 6: Shaders for the software rendererphongShading法线贴图Specular mapping 高光贴图tangent space normal mapping ‌切线空间法线贴图 Lesson 7: Shadow mapping GitHub主页&#xff1a;https://github.com/sdpyy 项目仓库:https://g…...

AiCube 试用 - 创建流水灯工程

AiCube 试用 - 创建流水灯工程 本文介绍了 Aiapp-ISP 仿真调试平台软件的 AiCube 工具&#xff0c;实现流水灯工程的快速创建的主要流程。 下载运行 下载 最新版 AIapp-ISP 软件&#xff1b; 解压并打开该软件&#xff0c;右侧操作界面选择并进入 Keil 仿真设置 标签项&…...

DBAPI设置服务器开机自启动

在 /etc/systemd/system 目录下创建一个新的服务文件&#xff0c;例如 dbapi.service [Unit] Descriptiondbapi standalone Service Afternetwork.target[Service] ExecStart/your-path/dbapi-enterprise-4.2.2/bin/dbapi.sh start standalone Restartalways Userroot[Install…...

“Nural”传感科技带给高速吹风筒的技术革命---其利天下技术

风筒界的革命&#xff0c;戴森将高速风筒带到了我们生活里&#xff0c;高速风筒的产生&#xff0c;将无刷电机的运用再一次向推到了我们新的产品领域。 然而随着智能家居领域的运用越来越广泛&#xff0c;戴森又将智能温控概念引入高速吹风筒&#xff0c;HD16引入“Nural”传感…...

DeepSeek-R1模型现已登录亚马逊云科技

在今年的Amazon re:Invent大会上&#xff0c;亚马逊CEO安迪贾西分享了公司内部开发近 1,000 个生成式 AI应用程序的经验教训。基于如此大规模的AI部署实践&#xff0c;贾西提出了三个关键观察&#xff0c;这些观察塑造了亚马逊在企业AI实施方面的方法。 第一点是&#xff0c;当…...

Python入门(8):文件

1. 文件基本概念 文件&#xff1a;存储在计算机上的数据集合&#xff0c;Python 通过文件对象来操作文件。 文件类型&#xff1a; 文本文件&#xff1a;由字符组成&#xff0c;如 .txt, .py 二进制文件&#xff1a;由字节组成&#xff0c;如 .jpg, .mp3 2. 文件打开与关闭…...

408 计算机网络 知识点记忆(4)

前言 本文基于王道考研课程与湖科大计算机网络课程教学内容&#xff0c;系统梳理核心知识记忆点和框架&#xff0c;既为个人复习沉淀思考&#xff0c;亦希望能与同行者互助共进。&#xff08;PS&#xff1a;后续将持续迭代优化细节&#xff09; 往期内容 408 计算机网络 知识…...

《Java编程思想》读书笔记:第九章 接口

目录 9.1抽象类和抽象方法 9.2接口 9.3完全解耦 9.4Java的多重继承 9.5通过继承来扩展接口 9.5.1组合接口时的名字冲突 9.6适配接口 9.7接口中的域 9.7.1初始化接口中的域 9.8嵌套接口 9.9接口与工厂 9.1抽象类和抽象方法 在第8章所有“乐器”的例子中&#xff0c;基…...

【gdutthesis模板】章节标题有英文解决方案

按下面格式修改代码即可 \section{中文{\rmfamily{English}}中文}{Chinese English Chinese}效果如下&#xff1a;...

【C语言入门】由浅入深学习指针 【第二期】

目录 1. 指针变量为什么要有类型&#xff1f; 2. 野指针 2.1 未初始化导致的野指针 2.2 指针越界导致的野指针 2.3 如何规避野指针 3. 指针运算 3.1 指针加减整数 3.2 指针减指针 3.3 指针的关系运算 4. 二级指针 5. 指针数组 5.1 如何使用指针数组模拟二维数组 上…...

循环神经网络 - 机器学习任务之异步的序列到序列模式

前面我们学习了机器学习任务之同步的序列到序列模式&#xff1a;循环神经网络 - 机器学习任务之同步的序列到序列模式-CSDN博客 本文我们来学习循环神经网络应用中的第三种模式&#xff1a;异步的序列到序列模式&#xff01; 一、基本概述&#xff1a; 异步的序列到序列模式…...

Java 8 到 Java 21 系列之 Optional 类型:优雅地处理空值(Java 8)

Java 8 到 Java 21 系列之 Optional 类型&#xff1a;优雅地处理空值&#xff08;Java 8&#xff09; 系列目录 Java8 到 Java21 系列之 Lambda 表达式&#xff1a;函数式编程的开端&#xff08;Java 8&#xff09;Java 8 到 Java 21 系列之 Stream API&#xff1a;数据处理的…...

.NET 创建MCP使用大模型对话二:调用远程MCP服务

在上一篇文章.NET 创建MCP使用大模型对话-CSDN博客中&#xff0c;我们简述了如何使用mcp client使用StdIo模式调用本地mcp server。本次实例将会展示如何使用mcp client模式调用远程mcp server。 一&#xff1a;创建mcp server 我们创建一个天气服务。 新建WebApi项目&#x…...

podman和与docker的比较 及podman使用

Podman 与 Docker 的比较和区别 架构差异 Docker&#xff1a;采用客户端 - 服务器&#xff08;C/S&#xff09;架构&#xff0c;有一个以 root 权限运行的守护进程 dockerd 来管理容器的生命周期。客户端&#xff08;docker 命令行工具&#xff09;与守护进程进行通信&#x…...

智慧农业总体实施方案

智慧农业概念与背景智慧农业是结合现代信息技术&#xff0c;对农业生产全过程进行智能化管理和服务的新型农业模式。它基于物联网、云计算等技术&#xff0c;实现资源节约、效率提高&#xff0c;解决食品安全和环境污染问题。 农业发展现状与问题当前农业面临资源短缺、食品安…...

基础科学中的人工智能︱如何用机器学习方法求解排列型组合优化问题?

排列&#xff08;permutation&#xff09;作为一个重要的离散数学概念&#xff0c;许多实际问题可以被刻画为n个候选对象的排列。基于给定的目标函数求解最优排列具有丰富的理论和应用价值。特别地&#xff0c;在以排列型问题为代表的组合优化问题中&#xff0c;近年来机器学习…...

脑影像分析软件推荐 | NBS-Predict:基于脑网络的机器学习预测工具包

目录 1.软件界面 2.工具包功能简介 3.软件安装注意事项 1.软件界面 2.工具包功能简介 NBS-Predict&#xff08;Network-based Statistic Predict&#xff09;工具包是一种用于神经影像数据分析的预测性扩展工具&#xff0c;它结合了网络基础统计&#xff08;Network-based S…...

一个alignment trap的解决办法

在移植一份代码时&#xff0c;遇到一个alignment trap的错误&#xff1a; 经过定位&#xff0c;触发alignment trap的汇编语句如下&#xff1a; printk("status %#x\r\n", stData.info->status); 38c0: f8d4 3181 ldr.w r3, [r4, #385] ; 0x181 38…...