【动态规划】最长上升子序列(单调队列、贪心优化)
创始人
2025-05-30 21:57:22
0

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

 

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

目录

题目:最长上升子序列

题解:

代码实现:

完结撒花:


本篇是对最长上升子序列基础做法的一种优化,没有看过基础做法的uu们可以看看这篇:最长上升子序列 

题目:最长上升子序列

题解:

优化的做法与之前相比,适用范围更广,当数据范围大的时候,基础做法会TLE。

但优化做法Dp的思想却少了,更像是一种贪心,由于本题是从DP衍生出来的,所以仍然将其归为DP。

废话不多说。

朴素做法为,找到前一个小于当前值,将其最长上升子序列加一,就为当前值得最长上升子序列。

但观察每一个被插入得值,例如有以下五个数字

3和1都为上升序列为1的数组,但能插入到1上的一定能插到三的上面,反之却不一定。所以我们可以想象出,只要保存上升序列长度中最小的那个值最为末端就可以了。

例如这里的3和1都为长度为1的上升序列,但我们只要保存1.

 

之后再将2插入到1上,此时更新上升序列长度为2的最后一个值为2.

4又可以插入到2后,所以更新长度为3的最后一个值为4。

 

最后如图所示

所以我们很容易就能归纳出上面的过程,找到最大小于待插入数的序列,在下一个位置更新其序列长度与队尾的值。

分析下代码实现,len为当前最长的子序列,利用二分查找寻找,最大的小于当前值x的位置,之后将下一个最长子序列的末位更新为x。循环往复即可

代码实现:

#include
#include
using namespace std;
const int N=100010;
int n;
int a[N];
int q[N];int main()
{cin>>n;for(int i=0;i>a[i];}int len=0;q[0]=-2e9;for(int i=0;i>1;if(q[mid]

完结撒花:

🌈本篇博客的内容【动态规划:最长上升子序列(单调队列、贪心优化)】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!

上一篇:Python作业题三

下一篇:6267: 糖果分发

相关内容

热门资讯

Android12之OpenS... 代码示例 SLObjectItf player;static SLEngineItf Engine...
肱动脉穿刺技术并发症,预防,护... 宏动脉穿刺是一种介入性操作技术,通常在患者的大腿或股动脉上进行,用于获取...
【nginx实战】nginx实... 前言 大家好,我是沐风晓月,本文首发于csdn 博客专栏【linux基本...
恩里克带巴萨巴黎均获三冠王 赛... 北京时间今天凌晨结束的欧冠决赛,巴黎圣日耳曼5-0大胜国际米兰,夺得队史首座欧冠,至此球队在本赛季拿...
外媒:以色列阻止阿拉伯国家召开... 【环球网报道 记者 索炎琦】据英国路透社、天空新闻网5月31日报道,以色列阻止了阿拉伯国家在巴勒斯坦...
欧冠决赛历史最大分差!巴黎5-... 直播吧06月01日讯 24/25赛季欧冠决赛,巴黎圣日耳曼5-0大胜国际米兰,5球分差创欧冠历史决赛...
04.hadoopHDFS win java访问hadoop //复制文件夹,配置环境变量//配置HADOOP_HOME为...
Ubuntu忘记超级用户roo... Ubuntu版本:Ubuntu 22.04 LTS 1启动系统,在启动过程中,反复按Esc键或者sh...
(19)C#传智:CSS,选择... vs2022保存html项目时,偶尔会有死机,只得强行关闭重新打开。 一...
原创 关... 当地时间5月28日,央视记者获悉,美国国际贸易法院阻止了美国总统特朗普在4月2日“解放日”宣布的关税...