最长上升(不下降)子序列LIS 笔记

news/2025/2/28 14:12:36/文章来源:https://www.cnblogs.com/dianman/p/18737477

最长上升(不下降)子序列LIS 笔记

动态规划基础

线性DP做法:

dp数组 \(f_i\) 记录以 \(a_i\) 结尾的最长上升子序列的长度,在每轮枚举 \(a_i\) 时,利用 \(j\) 指针,从头扫描找到 \(a_j<a_i\) ,这样 \(a_i\) 可以作为 \(a_j\) 的后续,接在 \(f_j\) 的后面,时间复杂度为 \(O(n^2)\)

int n;
cin>>n;
vector<int> a(n+10,1),f=a;
int ans=0;
for (int i=1;i<=n;i++) cin>>a[i];
for (int i=2;i<=n;i++){for (int j=1;j<i;j++){if (a[i]>a[j])f[i]=max(f[i],f[j]+1);//状态转移}ans=max(f[i],ans);
}
cout<<ans;

注意需要初始化 \(f\) 数组为 \(1\) ,因为所有元素都和自身可以形成一个长度为 \(1\) 的上升序列

状态转移方程为 \(f_i=max(f_i,f_j+1)\impliedby a_i>a_j\)


二分优化:

考虑第二层循环可以采用二分查找优化,于是需要维护一个序列 \(b\) 记录当前最长上升子序列

int n;
cin>>n;
vector<int> a(n+10,1),f=a,b=a;
for (int i=1;i<=n;i++) cin>>a[i];
b[1]=a[1];
int len=1;
for (int i=2;i<=n;i++){if (a[i]>b[len]){b[++len]=a[i];}else{auto iter=lower_bound(b.begin()+1,b.begin()+len+1,a[i]);//二分查找*iter=a[i];}
}
cout<<len;

更新 \(b\) 时存在两种情况:

  • \(a_i>b_{len}\) 即当前考虑的元素比维护的 \(b\) 中最大元素还要大,那么 \(a_i\) 一定可以续接在 \(b\) 后面

  • \(a_i\le b_{len}\) 那么可以考虑替换 \(b\) 中第一个大于等于 \(a_i\) 的元素 \(b_j\) ,替换后的 \(b\) 一定不劣

    例如数组 1 2 4 1 3 4x,y 分别代表 1,2 更新操作

x: 1 2 
x: 1 2 4 
y: 1 2 4 //1替换1
y: 1 2 3 //3替换4
x: 1 2 3 4 

len 变量可以记录答案,也就是最长上升子序列的长度,在做 y 操作时不会改变值

也就是说 len 存储了整个过程中历史存在的序列最长长度


相似的,最长不下降子序列也可以得出

int n;
cin>>n;
vector<int> a(n+10,1),f=a,b=a;
for (int i=1;i<=n;i++) cin>>a[i];
b[1]=a[1];
int len=1;
for (int i=2;i<=n;i++){if (a[i]>=b[len]){//可以取等b[++len]=a[i];}else{auto iter=lower_bound(b.begin()+1,b.begin()+len+1,a[i]);//二分查找*iter=a[i];}
}
cout<<len;

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

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

相关文章

Windows 系统调用学习笔记

依然是 x86 的,照着 lzyddf 师傅的 blog 和 OneTrainee师傅的blog 学的 Windows API Application Programming Interface,简称 API 函数。Windows API 是微软为 Windows 操作系统提供的一组函数、数据结构、常量和协议,允许开发者与操作系统进行交互。通过 Windows API,开发…

作业一:自我介绍+软工五问

作业一这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/SoftwareEngineeringClassof2023/homework/13325这个作业的目标 学习使用github和博客园自我介绍、兴趣爱好 我叫梁鑫…

deepseek---官方API接入

最近deepseek又开放充值了,而且还大降价,果断接入: 1、首先就是去充值,然后获取key 2、打开接口文档-找到合适自己的语言接口 3、直接复制代码就能运行<?php$curl = curl_init();curl_setopt_array($curl, array(CURLOPT_URL => https://api.deepseek.com/chat/comp…

香港服务器选择指南:高防 vs 站群 vs GPU场景解析

一、引言 背景:香港作为亚太地区数据中心枢纽,凭借国际带宽、网络自由、法律完善等优势,成为企业全球化布局的首选节点。 目标:解析香港服务器在不同业务场景下的选择逻辑,帮助企业根据需求匹配高防、站群或GPU服务器。 二、香港服务器的核心优势 | 网络自由性:| 国际带…

大模型常见文件格式safetensors vs. gguf

safetensorsHeader: 文件的元数据(大小、版本) Meta data: 列表,每个元素表示文件里存的张量的类型、形状、偏移量 Tensor data: 列表元素对应的张量数据ggufgguf不依赖外部的配置文件,它可以把配置文件、词表、tokenizer、template等存入gguf中(如果一个模型有多个gguf文…

2025年最值得入手的CRM系统!这5款真的好用不踩坑

挑CRM真让人头大!有的太复杂,上手难 有的功能太少,啥都干不了 有的收费离谱,小团队根本用不起别担心!今天就给大家盘点5款2025年最值得入手的CRM系统,每一款都是真实用户口碑不错的,不管你是创业小团队,还是大公司,这里面肯定有一款适合你。 ​​ 一、简道云CRM 如果你…

web开发 辅助学习管理系统开发日记 day4

/**法法法!!!忘记保存发布了,写了一天的草稿直接没了,我晕死,今天补档昨天的吧。 */今天开始开发员工管理模块了,也得知了3月14有校招的消息,看来要加快进度了(╯▔皿▔)╯ Q1:今天调了一个时间最长的bug,在写分页查询的时候我将三层架构全部写完之后,运行程序下面报…

Web前端入门第3问:前端需要学习哪些技术?

Web前端开发技术学习路径基础知识必备 HTML+CSS+JavaScript ,就目前来看,这三板斧是入门前端开发的门槛,无论如何都是逃不掉了。进阶知识必须会一门主流的前端框架,比如:React/Vue/Angular/Svelte,就国内的从业环境来看,Vue占有绝对优势,后续也会写一些 vue 相关的文章…

Web前端入门第1问:英语是否很重要?有哪些前置条件?

HELLO,这里是大熊学习前端开发的入门笔记。 本系列笔记基于 windows 系统。 在入门之前,是否有这样的疑问: 程序员的英语是否很牛?毕竟程序员的代码像天书一样,比如这样:答案是否定的。 英语并不是编程的前置条件,不要被看似天书的代码吓到,程序代码都存在一定的语法结…

红外成像工具 非接触式热成像仪 高精度温度测量与多功能应用

红外成像工具 非接触式热成像仪 高精度温度测量与多功能应用IFD-x是一款非接触式热成像仪器,采用红外阵列高精度温度传感器和先进的软件算法。该设备能够对视场范围内的物体进行红外成像,成像分辨率达到512*384像素,温度灵敏度为0.1℃,绝对精度为1.5℃,刷新频率最高可达64…

Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录

Educational Codeforces Round 175 (Rated for Div. 2) 比赛记录 比赛连接 手速场,上蓝场,但是有点唐,C 想错了写了半个多小时,想到正解不到 \(10\) 分钟就写出来了,看到 D 后悔没先做 D 了,过于简单了。 赛时切掉了 A - D,也算是成功渡劫上蓝了! 过题记录:A. FizzBuzz…

numpy知识点

1.点乘 .dot() 2.转置 .T 3.求逆矩阵np.linalg.inv() 4.拼接(返回变化后,但是并不对原来对象更改) np.concatenate((要拼接的ndarray对象),axis=按哪个维度拼接) axis=0 -->行增加 axis=1-->列增加 对于如果只有一个维度的ndarray,那么只能增加列,一直只有一行import…