单调递增子序列(二)

动态规划:单调递增子序列 给定一个长度为N的数组,找出一个最长的单调递增子序列(不一定连续,但是顺序不能乱 阅读详情

点击打开链接

                                                                  单调递增子序列(二)

                                                                                                     时间限制: 1000 ms  |  内存限制: 65535 KB
                                                                                                                               难度: 4
描述

给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。

如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。

输入
有多组测试数据(<=7)
每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0<n<=100000)。
数据以EOF结束 。
输入数据保证合法(全为int型整数)!
输出
对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。
样例输入
7
1 9 10 5 11 2 13
2
2 -1
样例输出
5
1
解析:由于计算数据比较大,用经典算法复杂度太大,时间会超限,所以采取二分法求解。


第一种:这是用一个子函数二分完成。

#include<stdio.h>
#include<algorithm>
#include<cstring>
const int N = 1e6 + 10;
using namespace std;
int n,a[N],dp[N],len,j;
int BinarySearch(int x)
{
	int left,right,mid;
	left = 1;
	right = len;
	mid=(left+right)/2;
	while(left<=right){
		if(x > dp[mid]) left = mid + 1;
		else if(x < dp[mid]) right = mid - 1;
		else return mid;
		mid = (left+right)/2;
	}
	return left;
}
int main()
{
	while(~scanf("%d",&n)){
		for(int i = 1; i <= n; i++)
		scanf("%d",&a[i]);
		dp[1] = a[1];
		len = 1;
		for(int i = 2; i <= n; i++){
			j = BinarySearch(a[i]);
			dp[j] = a[i];
			if(j>len) len = j;          //len = max(len,j);
		}
		printf("%d\n",len);
		
		
	}
} 

第二种:调用lower_bound函数完成。


#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
int num[1000000];
int dp[1005];
int ant = 0;
int main()
{
	int n;
	while (~scanf ("%d",&n))
	{
		for (int i = 1 ; i <= n ; i++)
			scanf ("%d",&num[i]);
		
		dp[1] = num[1];
		ant = 1;
		for (int i = 2 ; i <= n ; i++)
		{
			int pos = lower_bound(dp+1,dp+1+ant,num[i]) - dp;		
			ant = max(ant,pos);
			dp[pos] = num[i];
		}
		printf ("%d\n",ant);
	}
	return 0;
}

NYOJ - 214:单调递增子序列(二) NYOJ-214:单调递增子序列(二) 来源:http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=214 标签:动态规划、字符串 参考资料: 相似题目: 题目 给定一整型数列{a1,a2…,an}(0 &lt; n &lt;= 100000),找出单调递增最长子序列,并求出其长度。如:1 9 10... 阅读详情

相关推荐

单调递增序列

设计一个O(n2)时间的算法,找出由n个数组成的序列的最长单调递增子序列。

算法分析——单调递增子序列

题目描述 设计一个算法,找出由n个数组成的序列的最长单调递增子序列并对算法进行分析。要求时间复杂度分别为O(nlogn)和O(n^2). 方法1 对数组进行遍历,我们设置一个计数器来统计递增序列的长度并初始化为1(最短的递增序列是一个单独的数组,因此初始化为1)每次如果后一个数>前一个数,则计数器+1,否则将计数器置为1。当每次碰到递减的数时, ...

weixin_44755413的博客 2105

【零基础入门哈希签名架构,从Lamport到SPHINCS+】第二集 哈希签名树 Merkle Tree Authentication

在第一集中,我们一直忽略了一个问题。设想一下,假如有一个Hacker(黑客),在截获到Sender发送给Receiver的公钥之后,把这个公钥改成Hacker自己的公钥,然后再发给Receiver,那么Receiver就会误认为这是Sender的公钥。所以我们之前所说放方案,其安全性都需要建立在一个前提下:Receiver需要确认公钥确实是Sender发出的。

m0_50572808的博客 2456

单调递增子序列

前言:最长公共子序列 子序列可以不连续,但是有先后的次序关系. 为啥不能使用暴力解决这个问题:设A串长为n, B串长为m。A串子序列个数, B串子序列个数, 针对每一种情况进行匹配,时间复杂度变为: . 所以利用动态规划: A = {a, b, c, 1, 2, 3, a, b, c} B = {1, 2, 3, a, d, c} 定义状态: dp[i][j]: A串第i个位置,B串第...

ysugarr 2400

Aider的Repo Map功能

要把整个项目的所有文件添加到 Repo Map 中,需要调整 Aider 的行为,让它扫描整个代码库并将所有文件纳入 Repo Map。在使用 Aider 时,Repo Map 默认只包含当前会话中明确指定的文件(通过命令行传入的。通过命令行将整个项目的文件列表传递给 Aider,使其初始化时包含所有文件。,让 Aider 在初始化时自动加载整个项目的文件到。如果你的项目是 Git 仓库,Aider 可以通过。在 Aider 的交互模式中,手动添加整个项目文件。,从而生成包含所有文件的 Repo Map。

qq_41638872的博客 1639

鲸鱼优化算法(WOA)与门控循环单元(GRU)结合的预测模型(WOA-GRU)及其Python和MATLAB实现

Python和MATLAB的实现均突出模型结构和优化过程。2. **全局搜索与局部搜索结合**:WOA在寻优时,既有全局搜索的能力,又具备局部精准搜索的能力,能有效避免陷入局部最优解。2. **简化结构**:与长短期记忆(LSTM)相比,GRU的结构更为简化,避免了多层细胞结构,提高了计算效率。4. **使用WOA进行优化**:通过WOA迭代优化GRU模型中的参数,如学习率、批量大小和GRU单元的权重。3. **良好的表现**:GRU在多个时序数据序列的预测任务中表现优异,特别是在较短的数据序列中。

qq_45441438的博客 1326

单调递增子序列(Longest-Monotonically-Sequence)

单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列。首先,从定义上明确我们的问题。给定序列a1, a2, …, an,如果存在满足下列条件的子序列ai1i2im, (其中i1即称为一个原序列的长度为m的单调递增子序列,那么,现在的问题是我们要找出一个序列的最长的单调递增子序列。 直观上来说,一个序列Sn,它有2n个子序列,枚举所有的子序列,找出

Under The Sky 3097

Flutter 直接调用so动态库,或调用C/C++源文件内函数

我把 .so 文件尝试放过好几个目录/lib/,最终都会报这个错误,现在才知道库文件需要放在你根本想象不到的地方!!!尝试了一些方法还是不行后我放弃了 ffi,想着用 Flutter 的 MethodChannel 桥接 android/ios 原生,再让原生去调 native 层。一顿操作把Android端的搞定了,当然中间涉及到 Kotlin和C++ 层的数据类型映射的痛苦,而且业务函数也不像一个 helloworld 那么简单,别提有多痛苦了。

开发以大橘为重 8353

LeetCode算法题7.2:动态规划2,求上升子序列的数目

求序列中的上升子序列数目

Little_ant_的博客 1021

使用VS Code创建第一个Flutter工程

你可以使用任意文本编辑器结合命令行工具来开发Flutter应用。然而,我们推荐使用本文介绍的编辑器插件以获取更好的开发体验。这些插件提供了代码补全、代码高亮、widget辅助编辑等功能,以及为项目的运行和调试提供支持。推荐的开发工具有VS Code、Android Studio、IntelliJ。本文将重点介绍如何使用VS Code进行Flutter应用开发。

2501_91373349的博客 2129

069_死区效应对输出电压畸变的补偿思路

死区效应导致逆变器输出电压在过零点出现台阶畸变,引发THD升高。其本质是死区期间续流二极管钳位造成的非线性误差,与电流方向、负载大小、母线电压耦合。补偿需结合前馈(基于电流方向自适应调整偏置)与反馈(抑制残余谐波),关键在于准确判断电流方向(采用滞环滤波避免跳变)、合理设置补偿量(随负载动态调整),并注意补偿位置、极性及限幅防漂移。调试应通过差分探头、FFT频谱等手段验证效果,最终实现全负载范围内的低畸变输出。

2401_88858637的博客 22

nyoj 214 单调递增子序列 二 最优解

单调递增子序列(二) 时间限制:1000 ms  |           内存限制:65535 KB 难度:4   描述 给定一整型数列{a1,a2...,an}(0 如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。   输入有多组测试数据(输出对于每组测试数据输出整形数列的最长递增子序列的长度,每个输出占一行。样例输入 7 1

yanhuo0414的博客 401

PyTorch实战(4)——卷积神经网络(Convolutional Neural Network,CNN)

卷积神经网络 (Convolutional Neural Network, CNN) 是一种广泛应用的深度学习模型。通过参数共享、局部感知和空间结构等优势,能够更好地处理图像数据,并在图像识别、目标检测和图像生成等任务中展现出强大的能力。在本节中,介绍了卷积的计算方法以及卷积神经网络的基本组件,并使用 PyTorch 构建了卷积神经网络以深入了解其工作原理。

盼小辉丶的博客 1万+

NYOJ 214 单调递增子序列(二)

NYOJ 214 单调递增子序列(二)

倚世独殇 797

SpringBoot实战教程-springboot概论

Spring Boot 是一个快速开发框架,能够快速的整合第三方框架,简化XML配置,全部采用注解形式,以及自动配置。内置web容器,帮助开发者能够实现快速开发,简化了应用系统的初始搭建以及开发过程。

鸟哥哥的专栏 4157

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

nyoj 单调递增子序列(二)

单调递增子序列(二) 时间限制:1000ms | 内存限制:65535KB 难度:4 描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。 如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。 输入有多组测试数据(<=7)每组测试数据的...

weixin_30709635的博客 94

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

NYOJ 214:单调递增子序列(二)(二分优化)

描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。 如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。 输入 有多组测试数据(<=7) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的下一行里有n个整数,表示数列中的所有元素.每个整形数中间用空格间隔开(0...

542

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

NYOJ 214 单调递增子序列(二)

/*单调递增子序列(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一整型数列{a1,a2…,an}(0#include<cstdio> int dp[100005]; int main() { int n,x; int mid,r,l,len,i; while(~scanf("%d",&n)) { len=0; sca

李静静 476

NYOJ-214-单调递增子序列(二)

单调递增子序列(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一整型数列{a1,a2…,an}(0#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<math.h> #include<algorithm> #include<queue> #i

Prim 846

nyoj 214 单调递增子序列(二)【二分+DP】

nyoj 214 单调递增子序列(二)【二分+DP】

逝去的时光 361

nyoj 214 单调递增子序列(二)

传统的动规写单调递增会超时,所以用二分优化一下

nyist_xsk 269

214 单调递增子序列(二)

//思路:每输入一个数,如果大于队尾元素则加入队列,否则替换掉第一个比它大的数(二分查找)。 #include #include #include using namespace std; int main() { int n,m,i,j,l,r,mid; int a[100001]; while(~scanf("%d",&n)) { j=0;

syklar&miracle 442

NYOJ 单调递增子序列(二)

单调递增子序列(二) 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给定一整型数列{a1,a2...,an}(0<n<=100000),找出单调递增最长子序列,并求出其长度。 如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。 输入有多组测试数据(<=7) 每组测试数据的第一行是一个整数n表示...

weixin_30702413的博客 97

NYOJ-214 单调递增子序列(二)

单调递增子序列(二) 时间限制:1000 ms  |           内存限制:65535 KB 难度:4   描述 给定一整型数列{a1,a2...,an}(0&lt;n&lt;=100000),找出单调递增最长子序列,并求出其长度。 如:1 9 10 5 11 2 13的最长单调递增子序列是1 9 10 11 13,长度为5。   输入有多组测试数据(&lt;=7) 每...

weixin_34209406的博客 210
上一篇: 单调递增最长子序列(一)
下一篇: An problem about date
☞十一
博客等级 码龄9年 8粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值