nyist oj 214 单调递增子序列(二) (动态规划经典)

2023-05-16

单调递增子序列(二)

时间限制: 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

来源

[521521]改编

这个题和前面做的那个单调递增子序列题目意思是一样的,但是这个题目数据量比较大,用前面的那种方法就会超时,前面的那一种方法dp[i]:用来储存以ai为末尾的最长递增子序列的长度;时间复杂度是o(n2),这个题目的数据范围到了100000,用这种方法就会超时;

所以我们采用另一种方法,用dp[i]:储存长度为i+1的递增序列中末尾元素的最小值;

 

建立一个一维数组dp[ ],用dp[i]保存长度为i的单调子序列的末尾元素的值,用top保存单调子序列的最大长度。

初始top=1,dp[1]=a1;

然后,我们从前向后遍历序列An(i : 2~n)。显然,我们会遇到两种情况:

1.a[i] > dp[top]。此时,我们把a[i]加入到长度为top的单调序列中,这时序列长度为top+1,top值也跟着更新,即dp[++top] = a[i];

2.a[i]<=dp[top]。此时,a[i]不能加入长度为top的单调序列,那它应该加入长度为多少的序列呢?

做法是,从后向前遍历dp[ ] (j: top-1~1),直到满足条件 a[i] > dp[j],此时,类似于步骤1,我们可以把a[i]加入到长度为j的单调序列中,这时此序列长度为j+1;(这段话转载于http://www.cnblogs.com/mycapple/archive/2012/08/22/2651453.html)

 

如果直接这样做的话,时间复杂度也会达到o(n2),但是这里还可以优化,我们在遍历更新的时候可以采用更高效率的方法;这里我们可以采用二分搜索,对前面的a[i]进行更新;这种方法的时间复杂度就是o(nlogn)

 

下面是代码:

 

 

#include <cstdio>
#include <cstring>
const int maxn=100001;
int dp[maxn],a[maxn];
int Binary_search(int len,int k)//二分搜索
{//查找比第一个比dp[i]小或者是相等的位置
    int start,end,mid;
    start=1;
    end=len;
    while(start<=end)
    {
        mid=(start+end)>>1;
        if(k==dp[mid])
            return mid;
        if(k>dp[mid])
            start=mid+1;
        else
            end=mid-1;
    }
    return start;
}
int main()
{
    int n,i,t,len;
    while(scanf("%d",&n)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        for(i=0;i<n;i++)
            scanf("%d",&a[i]);
         len=1;
         dp[1]=a[0];//这里要从1开始
         for(i=1;i<n;i++)
         {
             t=Binary_search(len,a[i]);//通过二分搜索查找a[i]要插入的位置
             dp[t]=a[i];//更新dp的值
             if(t>len)//如果插入的位置在最后,更新最大的长度
                len=t;
         }
         printf("%d\n",len);
    }
}


下面是最优代码,好简短的:用了一个STL里面的lower_bound函数,这个函数就是二分查找,返回第一个比val小的位置,把这个函数使用熟练也会比较方便,与此相对的还有一个upper_bound函数;http://blog.csdn.net/niushuai666/article/details/6734403  这个内容可以参考这篇博客

 

 

 

 
#include<cstdio>
#include<algorithm>
using namespace std;
const int MAX=100100;
int num[MAX],top=0;
int main()
{
	int n;
	while(~scanf("%d",&n))
	{
		scanf("%d",&num[0]);
		top=1;
		for(int i=1;i!=n;i++)
		{
			scanf("%d",&num[i]);
			int * p=lower_bound(num,num+top,num[i]);
			if(p-num==top) ++top;
			*p=num[i];
		}
		printf("%d\n",top);
	}
	
}        

 

 

 


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nyist oj 214 单调递增子序列(二) (动态规划经典) 的相关文章

  • 顺时针打印矩阵

    题目描述 输入一个矩阵 xff0c 按照从外向里以顺时针的顺序依次打印出每一个数字 xff0c 例如 xff0c 如果输入如下矩阵 xff1a 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1
  • 包含min函数的栈

    题目描述 定义栈的数据结构 xff0c 请在该类型中实现一个能够得到栈最小元素的min函数 思路 xff1a 用一个栈去存储所有元素 然后一个一个去比较 将小的那个值放到变量min里面 xff1b 代码如下 xff1a import jav
  • 栈的压入、弹出序列

    题目描述 输入两个整数序列 xff0c 第一个序列表示栈的压入顺序 xff0c 请判断第二个序列是否为该栈的弹出顺序 假设压入栈的所有数字均不相等 例如序列1 2 3 4 5是某栈的压入顺序 xff0c 序列4 xff0c 5 3 2 1是
  • 从上往下打印二叉树

    题目描述 从上往下打印出二叉树的每个节点 xff0c 同层节点从左至右打印 思路 xff1a 意思就是按层遍历然后放到一个list集合里面去 xff0c 所以创建一个队列每次把一层的结点放进去 xff0c 然后一个一个判别是否有left结点
  • 二叉搜索树的后序遍历序列

    题目描述 输入一个整数数组 xff0c 判断该数组是不是某二叉搜索树的后序遍历的结果 如果是则输出Yes 否则输出No 假设输入的数组的任意两个数字都互不相同 思路 xff1a 因为是二叉搜索树 xff0c 所以根节点的左子树小于右子树 x
  • 二叉树中和为某一值的路径

    题目描述 输入一颗二叉树和一个整数 xff0c 打印出二叉树中结点值的和为输入整数的所有路径 路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径 思路 xff1a 用先序遍历递归的思想去实现 xff0c 到最后叶节点如果不能
  • 复杂链表的复制

    题目描述 输入一个复杂链表 xff08 每个节点中有节点值 xff0c 以及两个指针 xff0c 一个指向下一个节点 xff0c 另一个特殊指针指向任意一个节点 xff09 xff0c 返回结果为复制后复杂链表的head xff08 注意
  • ubantu20下python安装和卸载

    查看系统版本 python3 version 卸载ubantu上的python版本 sudo apt get remove python3 卸载python3及其依赖 sudo apt get remove auto remove pyth
  • [转]DBSCAN聚类算法——机器学习(理论+图解+python代码)

    原文链接 xff1a https blog csdn net huacha article details 81094891 一 前言 二 DBSCAN聚类算法 三 参数选择 四 DBSCAN算法迭代可视化展示 五 常用的评估方法 xff1
  • 求1+2+3+...+n

    题目描述 求1 43 2 43 3 43 43 n xff0c 要求不能使用乘除法 for while if else switch case等关键字及条件判断语句 xff08 A B C xff09 思路 xff1a 用递归 xff08
  • 把字符串转换成整数

    题目描述 将一个字符串转换成一个整数 xff0c 要求不能使用字符串转换整数的库函数 思路 xff1a 设置两个标志位 一个tag 为1表示是正数 xff0c 为0表示是负数 xff0c 一个index xff0c 为 43 则index是
  • 数组中重复的数字

    题目描述 在一个长度为n的数组里的所有数字都在0到n 1的范围内 数组中某些数字是重复的 xff0c 但不知道有几个数字是重复的 也不知道每个数字重复几次 请找出数组中任意一个重复的数字 例如 xff0c 如果输入长度为7的数组 2 3 1
  • 表示数值的字符串

    题目描述 请实现一个函数用来判断字符串是否表示数值 xff08 包括整数和小数 xff09 例如 xff0c 字符串 34 43 100 34 34 5e2 34 34 123 34 34 3 1416 34 和 34 1E 16 34 都
  • 字符流中第一个不重复

    题目描述请实现一个函数用来找出字符流中第一个只出现一次的字符 例如 xff0c 当从字符流中只读出前两个字符 34 go 34 时 xff0c 第一个只出现一次的字符是 34 g 34 当从该字符流中读出前六个字符 google 34 时
  • 链表中环的入口结点

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 题目描述 一个链表中包含环 xff0c 请找出该链表的环的入口结点 思路 xff1a 设置两个引用 A和B 指向头 xff0c 然
  • 删除链表中重复的结点

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 题目描述 在一个排序的链表中 xff0c 存在重复的结点 xff0c 请删除该链表中重复的结点 xff0c 重复的结点不保留 xf
  • 二叉树的下一个结点

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 题目描述 给定一个二叉树和其中的一个结点 xff0c 请找出中序遍历顺序的下一个结点并且返回 注意 xff0c 树中的结点不仅包含
  • 按之字形顺序打印二叉树

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 import java util ArrayList import java util Queue import java uti
  • 对称的二叉树

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 请实现一个函数 xff0c 用来判断一颗二叉树是不是对称的 注意 xff0c 如果一个二叉树同此二叉树的镜像是同样的 xff0c
  • 【unix】unix环境高级编程

    文章目录 1 UNIX基础知识1 基本知识2 文件和目录3 输入和输出4 程序和进程5 出错处理6 用户标识7 信号8 时间9 系统调用和库函数 标准化和实现1 标准化 ISO C POSIX Single UNIX Specificati

随机推荐

  • 序列化反序列二叉树

    需要学习资料的 43 微信公众号 学习资源后台找我 本人比较忙 我看到了会在后台帮你 xff0c 谢谢关注啦 题目描述 请实现两个函数 xff0c 分别用来序列化和反序列化二叉树 思路 xff1a 序列化的时候遇到null的结点就补充 xf
  • java 判断字符串是否为null的四种方法:

    以下是java 判断字符串是否为空的四种方法 xff1a 方法一 最多人使用的一个方法 直观 方便 但效率很低 if s 61 61 null s equals 34 34 方法二 比较字符串长度 效率高 是我知道的最好一个方法 if s
  • spring-boot推送实时日志到前端页面显示

    个人技术网站 欢迎关注 网上有很多后台推送日志到前端页面的例子 xff0c 这里我也借鉴了别人的做法 稍加改进一下 以前做前端页面显示日志一般都会想到ajax轮询去做 xff0c 这样太耗费服务器资源了 xff0c 性能也很差 使用长连接来
  • [Ubuntu][Android]快速配置Android USB设备的权限

    1 复制如下内容到新建文本文件中 xff0c 并保存为51 android rules SUBSYSTEM 61 61 34 usb 34 ENV DEVTYPE 61 61 34 usb device 34 MODE 61 34 0666
  • shell脚本一次性将tab制表符改为4空格的方法

    问题描述 今天需要修改一些bash脚本 xff0c 因为考虑到pycharm里面能够直接写 xff0c 而我用pycharm比较多 xff0c 所以直接用pycharm写了 xff0c 由于改的那个bash脚本是别的同事写的 xff0c 里
  • matlab 并行计算 parfor

    转自 xff1a http www xiongfuli com E5 B9 B6 E8 A1 8C E8 AE A1 E7 AE 97 2016 05 Matlab Parfor html 在Matlab下使用parfor实现多核并行计算
  • Windows安装和完全卸载MySQL8(以MySQL8.0.31版本为例) 之 Zip 方式(超详细教程)

    文章目录 一 前言二 安装1 下载MySQL2 安装MySQL3 小结 xff1a 4 修改环境变量 3 完全卸载 一 前言 MySQL8相比之前版本改动还是挺大 xff0c 主要有以下几点 xff1a MySQL8之后并不需要my ini
  • Nginx显示500错误原因和解决方法

    文章目录 1 背景2 Nginx 常见的几种报错3 解决500错误 1 背景 最近在操作nginx 的时候出现了 Nginx 500 内部错误 xff0c 在此记录一下原因 xff0c 项目采用的是前后端分离方式 xff0c 后端Sprin
  • Cause: java.sql.SQLException: Expression #1 of ORDER BY clause is not in SELECT list

    文章目录 原因分析 xff1a 解决方法 xff1a 原因分析 xff1a mysql 8里sql mode 中 select distinct 不允许和 order by 连用 可以查看 sql model show variables
  • 14.2 shell函数参数

    2 shell函数参数 2 1 位置参数2 2 选项参数2 2 1 getopts getopt的区别2 2 2 getopts的使用2 2 3 getopt的使用 Shell 函数参数的传递和其它编程语言不同 xff0c 没有所谓的形参和
  • protoc和protoc-gen-go-grpc安装及编译

    一 install protocol buffer compiler PB REL 61 34 https github com protocolbuffers protobuf releases 34 curl LO PB REL dow
  • powershell 脚本解压zip文件到指定目录

    span class token keyword Function span Unzip span class token operator span File span class token punctuation span span
  • 不用第三方软件 用DISM命令备份与还原win8系统

    分享一个来自远景论坛的的教程如何通过dism命令给自己的win8系统备份和如何通过dism命令还原系统 用 DISM 命令进行系统备份与还原不需要任何第三方软件 xff0c 是利用 Windows 7 Windows 8 系统自带的 DIS
  • ubuntu20.04+anaconda3+tensorflow-gpu2.1安装

    磁盘分区 WIN系统中 xff0c 右键我的电脑 管理 磁盘管理 xff0c 首先留给Ubuntu一定的空间 xff0c 这里为600G左右 Ubuntu系统盘制作 下载Ubuntu对应版本 xff0c 制作启动盘 Ubuntu安装 U盘启
  • nyist 27 水池数目(dfs搜索)

    xfeff xfeff 水池数目 时间限制 xff1a 3000 ms 内存限制 xff1a 65535 KB 难度 xff1a 4 描述 南阳理工学院校园里有一些小河和一些湖泊 xff0c 现在 xff0c 我们把它们通一看成水池 xff
  • XTUOJ 1176 I Love Military Chess(模拟)

    xfeff xfeff I Love Military Chess Accepted 45 Submit 141Time Limit 1000 MS Memory Limit 65536 KB 题目描述 陆军棋 xff0c 又称陆战棋 xf
  • 数据结构课程设计之一元多项式的计算

    数据结构不是听会的 xff0c 也不是看会的 xff0c 是练会的 xff0c 对于写这么长的代码还是心有余也力不足啊 xff0c 对于指针的一些操作 xff0c 也还是不熟练 xff0c 总出现一些异常错误 xff0c 对于数据结构掌握还
  • 数据结构课程设计之通讯录管理系统

    数据结构的第二个课程设计 xff0c 在c语言课程设计的基础上加以改进 xff0c xff08 加强版 xff09 xff0c 保存一下代码 xff0c 对文件的处理 xff0c 还是有一点一问题 xff0c 还有待改进 include l
  • 在网页中添加音乐

    最近在折腾一个网页 xff0c 对于一个有强迫症的人来说 xff0c 就想在网页中插入音乐 xff0c xff08 当做背景音乐 xff09 xff0c 然后自己百度了好多资料 xff1b 就在这里总结一下 xff1a 第一步 xff1a
  • nyist oj 214 单调递增子序列(二) (动态规划经典)

    单调递增子序列 二 时间限制 xff1a 1000 ms 内存限制 xff1a 65535 KB 难度 xff1a 4 描述 给定一整型数列 a1 a2 an xff08 0 lt n lt 61 100000 xff09 xff0c 找出