NLOG 最长不下降子序列

关于O(nlogn)求最长(上升/不上升/下降/不下降)子序列的总结 前置知识 这里参考了这篇博文 c++中lower_bound( )和upper_bound( )函数: 在从小到大的排序数组中 lower_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于或等于num的数字,找到返回该数字的地址,不存在则返回end。通过返回的地址减去起始地址begin,得到找到数字在数组中的下标。 upper_bound( begin,end,num):从数组的begin位置到end-1位置二分查找第一个大于num的数字,找到返回 阅读详情

LIS有N2的算法,还有NLOGN的算法,这里说一下NLOGN的算法。

我们设S[]为原始序列,F[i]为以S[i]结束的LIS的最大长度。在求LIS时,对于S[i],我们找一个最大的可能的F[j],(j<i)使S[i]尽可能大,在寻找一个F[i]时,我们可以用二分查找优化。

我们要通过枚举F[1...i-1]找到可作为F[i]前缀的LIS的最大长度,换一种思路,我们就可以枚举可能的长度——用二分——再检查它是否可以连接在S[i]的前面。

于是我们用C[i]记录长度为i的LIS的末位的最小值(这里有点贪心的想法),然后在处理S[i]时,通过二分,查找末尾数小于S[i]的LIS的最大长度,然后更新C[i]数组,最终通过查询C[i]数组得到结果。

编码的难点是二分查找,需要仔细体会。

对于二分:

A. 如果一个有序表中有元素X, 则通过二分查找必能找到X

B. 在二分中,我用v记录可行的一个LIS长度(即存在长度为v的可以连接在S[i]前面的LIS),然后查找是否有更大的v,于是要让mid=low+1,此时若存在更好的v一定可以找到。

/*
 * TYVJ-1049 最长不下降子序列
 * mike-w
 * 2012-10-16
 */
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#define MAXSIZE 5555
#define INF 0x3ffffff
#define xLOL_DEBUG

int s[MAXSIZE];
int c[MAXSIZE];
int n;

int min(int e1, int e2)
{
	return e1<e2?e1:e2;
}

int main(void)
{
	int i, j, high, low, mid, v;

	scanf("%d", &n);
	for(i=1; i<=n; i++)
		scanf("%d", s+i);
	
	for(i=1; i<=n; i++)
		c[i]=INF;
	c[1]=s[1];
	for(i=2; i<=n; i++)
	{
		high=i-1, low=1, v=-1;
		while(low<=high)
		{
			mid=(low+high)/2;
			if(c[mid]<=s[i])
				low=mid+1, v=mid;
			else
				high=mid-1;
		}

		if(v==-1) 		/* s[i] is too small */
			c[1]=s[i];
		else 			/* update c[] */
			c[v+1]=min(s[i], c[v+1]);

#ifdef LOL_DEBUG
		printf("i=%d v=%d\n", i, v);
		puts("c:");
		for(j=1; j<=n; j++)
			printf("%d ", c[j]);
		putchar('\n');
#endif
	}
	for(i=n; i>=1; i--)
		if(c[i]<INF)
			break;
	printf("%d\n", i);
	return 0;
}



希望上述文字能解决大家的一点问题——貌似我有点言语混乱。
避坑指南:AUTOSAR FlashDriver操作DFlash模拟EEPROM时,你最容易忽略的5个细节 本文深入探讨了AUTOSAR FlashDriver在DFlash模拟EEPROM操作中最容易被忽视的五大细节问题,包括地址合法性检查、操作时序控制、并发访问冲突、电源稳定性管理和寿命管理。通过实际项目案例和工程化解决方案,帮助开发者避免常见陷阱,提升汽车电子控制单元(ECU)的可靠性和稳定性。 阅读详情

相关推荐

离线安装PlutoSDR硬件支持包全攻略:没有MathWorks账号也能搞定MATLAB集成

本文详细介绍了在没有MathWorks账号和网络环境的情况下,如何离线安装PlutoSDR硬件支持包并实现MATLAB集成的完整解决方案。从驱动安装、设备识别到MATLAB支持包的离线部署,提供了全面的步骤指导和常见问题排查方法,特别适合高校实验室、军工单位等内网环境使用。

js777的博客 265

【转】nlogn的最长不降子序列(LIS)

O(nlogn)的算法关键是它建立了一个数组temp[],temp[i]表示长度为i的不下降序列中结尾元素的最小值,用top表示数组目前的长度,算法完成后top的值即为最长不下降子序列的长度。设当前的以求出的长度为top,则判断num[i]和temp[top]:1.如果num[i]>=temp[top],即num[i]大于长度为top的序列中的最后一个元素,这样就可以使序列的长度增...

CSND12333的博客 420

STM32移植LVGL(LittleVGL)

**STM32移植LVGL(LittleVGL)**

qq_53000374的博客 1万+

最长不下降子序列(复杂度较低的方法)

最长不下降子序列随笔 参考文章最长不下降子序列nlogn算法详解 最长不下降子序列是动态规划的基础题,通常我们会这样去解它 int a[MAXN], d[MAXN]; int dp() { d[1] = 1; int ans = 1; for (int i = 2; i <= n; i++) { for (int j = 1; j < i; j++) if (a[j] <= a[i]) { d[i] = max(d[i], d[j] + 1)

skl4869的博客 491

别再被网站识别成机器人了!用Python的undetected_chromedriver+Selenium实现无痕自动化

本文详细介绍了如何利用Python的undetected_chromedriver和Selenium实现无痕自动化,突破现代网站的反爬系统。通过修正浏览器指纹、模拟人类操作行为,并结合实战案例,帮助开发者构建难以被识别的自动化脚本,适用于电商监控等场景。

weixin_30367169的博客 249

给新考上北大软件与微电子学院的同学——利用北大资源

利用北大资源 首先,恭喜大家考入北京大学!希望软院成为各位人生旅途中快乐的一站! 说明:限于本人搜集能力有限,本文只列出本人常利用的资源(上课老师会告知的资源也不在此列),本文所述的资源只是北大可利用资源的一个子集。 一、 图书馆资源:北京大学图书馆的资源数量,我就不多废话了,这里主要说一样怎样利用这些资源。 a) 传统资源分布及查找:这种资源主要包括纸质书箱、杂志、光盘等内...

Felomeng的技术博客 1万+

最长非降子序列nlogn C++实现

#include <iostream> #include <algorithm> #include <vector> using namespace std; int main() { int n, x; vector<int> v, vec; cin >> n; for (int i = 0; i &l...

Terrances的博客 492

论文必备 - YOLOv12热力图可视化,支持指定模型,指定显示层,设置置信度,以及10种可视化实现方式

本文带来的是YOLOv12热力图可视化功能,支持,以及。我们经常看到一些论文里绘制了不同的热力图,一方面能够直观的感受其模型的有效性,另一方面也丰富了论文内容。特别是在使用了注意力模块的网络中,热力图就可以验证注意力机制是否真正聚焦到了预期的重要特征上,以便对模型的有效性和合理性进行评估。例如这篇文章中展示的,就很能够表达作者改进后的模型相比之前模型的优越性。

Limiiiing的博客 1705

最长不下降子序列的O(nlogn)算法

用O(NlogN)的复杂度求 最长不下降子序列。深度挖掘数据下的规律,可以加速dp的推导。

说文科技,做有态度的研究。 6560

最强AI插件Augment,适配idea、vscode,对标cursor!

Augment是一款新兴的AI辅助编码工具,能够无缝集成到IDEA和VS Code等主流IDE中,直接对标专业AI编码工具Cursor。其核心优势包括多IDE适配、无缝集成、代码理解与生成以及对话式编程体验。Augment通过插件形式保留原IDE功能和快捷键习惯,降低学习成本,同时提供深度理解项目上下文和生成高质量代码的能力。此外,Augment还具备审查变更、检查点、代理与代理自动等核心功能,支持从简单配置更改到复杂功能实现的各种开发任务。Augment代表了AI辅助编程工具的新方向,通过增强开发者熟悉的

todoitbo的博客 1万+

解锁RK3588:内核模块签名与安全启动配置全攻略

RK3588作为一款高性能嵌入式SoC芯片,其内核模块签名与安全启动配置是保障系统安全的核心机制。本文详细介绍了RK3588的芯片特性,重点阐述了安全启动的硬件信任链原理和内核模块签名的实现方法。通过具体步骤演示了从密钥生成、模块签名到验证加载的完整流程,并深入解析了安全启动配置的硬件连接、软件工具准备、密钥烧录等关键环节。此外,还提出了防御旁路攻击和动态信任链扩展等高级安全策略,为RK3588在工业控制、智能安防等高安全要求场景中的应用提供了全面的安全解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 346

O(nlog(n))的最长上升(不下降)子序列算法

【转】http://blog.sina.com.cn/s/blog_4b1e4fe9010098af.html先回顾经典的O(n^2)的动态规划算法,设A[i]表示序列中的第i个数,F[i]表示从1到i这一段中以i结尾的最长上升子序列的长度,初始时设F[i] = 0(i = 1, 2, ..., len(A))。则有动态规划方程:F[i] = max{1, F[j] + 1} (j = 1, 2,

tanzhangwen的专栏 433

计算电磁学(三)有限差分方法

有限差分方法(FDM)是一种数值处理方法,通过将偏微分方程变换为一组代数方程,通过求解代数方程组来得到原边值问题的近似值。由于有限差分法非常简单,所以也特别的稳定高效。其中时域有限差分方法(FDTD)是电磁分析中的常用方法。在计算电磁学中,常用有限差分方法(finite difference equations)来替代微分方程。一个有限差分法通常包括三个步骤将求解域划分网格用有限差分方程逼近给定的微分方程求解在给定边界条件和初始状态下的方程常用的网格模型方阵斜方阵三角阵圆形阵。

CCC_B的博客 1639

LIS最长上升子序列

构造一个ans数组,首先把第一个元素放入第一个位置,然后枚举每一个元素,如果元素比ans里面的最大元素还大,则放入ans元素的下一个位置,否则运用二分查找找到在ans数组中的位置,更新已有的元素。最后ans数组的序列长度为结果。NLog(N)最长不下降子序列 转载于:https://www.cnblogs.com/Tidoblogs/p/11134615.html...

weixin_30451709的博客 57

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

最长上升子序列模板

最长上升子序列 O(n^2) #include<iostream> #include<cstdio> #include<string.h> using namespace std; const int N=1005; int a[N],dp[N]; int main() { int n,ans=-1; scanf("%d",&n); for(...

黄油^小饼干的博客 187

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

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

最长上升(不下降)子序列 题目描述:给出nnn个数,求其最长上升(不下降)子序列。 分析:其实上升和不下降基本一致,一个===的区别,这里讨论不下降的情况。 方法1:O(n2)O(n^2)O(n2) [DPDPDP] 我们设FiF_iFi​表示以AiA_iAi​结尾的最长不下降子序列的长度,那么Fi=F_i=Fi​=什么呢? 因为它可以跟前面的拼接上,所以如果Ai>=Aj(i>j)A_i>=A_j(i>j)Ai​>=Aj​(i>j),那么Fi=max(Fi,Fj+1)

chaomengwangzhe的博客 218

数学建模模型总结

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

动态规划(2):最长不下降子序列优化版本

最长不下降子序列问题:在一个给定的数值序列中,找到一个子序列,使得这个子序列元素的数值依次递增,并且这个子序列的长度尽可能地大。 时间复杂度:O(nlog2n) 因为采用二分查找在有序序列num中查找,所以为O(nlog2n) 注意:num中不是最长不下降子序列,而max_length则是最长不下降子序列的长度 //freopen("hao.txt","r",stdin); #include <iostream> #include <cstdlib> #include <cst

TSWorld 363

最长不下降子序列 输出方案数

对于最长不下降子序列的求解,朴素的解法是N^2的,也可以用单调队列优化,从而降时间复杂度为Nlog(n). 涉及到方案数的输出时,只需要降长度为1的最长XX子序列的方案数赋成1,其他的长度的方案数均由前一个长度的方案推出. 如下图所示: 首先用朴素的最长非降子序列的方法求出每一个在最优序列中的位置: 建立如下的表 值的大小: 68 69 ...

weixin_30917213的博客 374

CSP2022模拟八 tribe【DP】

二分求最长不下降子序列

JA_yichao欢迎你 cnblogs账号:https://www.cnblogs.com/mayichao/ 456

DP优化(lis)2018-08-17

DP是一个好东西(逃 传送门:https://www.luogu.org/problemnew/show/P1020 这道题就是一个最长不下降子序列,大家都知道,这就是一个DP问题,时间复杂度是O(nlogn),在我之前的博客里有写到~~ 但是,O(nlogn)的时间复杂度貌似有点高(算高?那么O(n平方)算什么?) 那么,这里我要推荐一种O(nlog2n)的算法!!!(二分答案) 思路...

qq_42875611的博客 250

[HAOI2006]数字序列,洛谷P2501,Dp+较大的思维深度+神定理

正题       题目链接在这里       好像很难,第一问都不知道怎么做。。。       假设我们已经知道第一问的答案序列,一个结论就是,(因为如果连中间塞数都满足不了,那么就一定不是答案       变形:       我们令,那么对于答案序列,满足       这就很明显是求b的最长不下降子序列,O(n log2 n)做法很明了。       第一问解决!       考...

Deep_Kevin的娱乐空间 616

BZOJ 2149 拆迁队

斜率优化DP

Fuxey 1392

最长不降子序列nlogn写法

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

weixin_43751631的博客 300

最长上升子序列nlog(n)

nlog(n)的方法从很久之前就看了,愣是没看懂,因为这个条件 现在,我们仔细考虑计算F[t]时的情况。假设有两个元素A[x]和A[y],满足 (F[]保存LIS长度) (1)x (2)A[x] (3)F[x] = F[y]  没看懂,当A[x] 其实这只是传递一个思想而已,当两者的LIS都一样时取最小值效果更好。只要明白这一点就行了。 再根据那个思想,我们会得到一个启示

Lin_disguiser的博客 813

动态规划算法——最长上升子序列

今天我们要讲的是最长上升子序列(LIS)。【题目描述】给定N个数,求这N个数的最长上升子序列的长度。【样例输入】      【样例输出】7        42 5 3 4 1 7 6 那么什么是最长上升子序列呢? 就是给你一个序列,请你在其中求出一段不断严格上升的部分,它不一定是要连续的。 就像这样:2,3,4,7和2,3,4,6就是序列2 5 3 4 1...

weixin_30445169的博客 178

最长上升子序列和最长下降子序列

最长不上升子序列和最长不下降子序列 C:勤奋的杨老师 AC代码: #include&amp;amp;lt;bits/stdc++.h&amp;amp;gt; #include&amp;amp;lt;iostream&amp;amp;gt; #include&amp;amp;lt;cstdio&amp;amp;gt; #include&amp;amp;lt;cstring&amp;amp;gt; #include&amp;

打过ICPC/CCPC,学习ACM算法,Linux内核,Openharmony,加油努力开心珍惜 1073
上一篇: [POJ-2631] 求树的直径
下一篇: [HDU-1051] 贪心
creativewang
博客等级 码龄17年 20粉丝 203原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值