最长上升子序列

Time Limit: 3000MSMemory Limit: 65536KB
SubmitStatisticDiscuss

Problem Description

一个数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, ..., aN),我们可以得到一些上升的子序列(ai1, ai2, ..., aiK),这里1<= i1 < i2 < ... < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8)。

你的任务,就是对于给定的序列,求出最长上升子序列的长度。

Input

输入的第一行是序列的长度N (1 <= N <= 1000)。第二行给出序列中的N个整数,这些整数的取值范围都在0到10000。

Output

最长上升子序列的长度。

Example Input

7
1 7 3 5 9 4 8

Example Output

4
上升子序列:去掉原序列中任意多个数字,剩余按升序排列排列的新序列。
思路:避免重复查找比较,用数组记录每个位置下最大上升序列长度。
次实现方法时间复杂度为n*n
#include<cstdio>
#include<cstring>
using namespace std;
int main()
{int n,maxi,maxlen=1;scanf("%d",&n);int a[n+1],len[n+1];for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)len[i]=1;for(int i=2;i<=n;i++){maxi=0;for(int j=1;j<=i-1;j++){if(a[j]<a[i]&&len[j]>maxi)maxi=len[j];}len[i]=maxi+1;if(len[i]>maxlen)maxlen=len[i];// printf("maxlen=%d\n",len[i]);}printf("%d\n",maxlen);return 0;
}

时间复杂度为nlogn的实现方法:

#include<cstdio>
#include<cstring>
using namespace std;
int main()
{int n;while(scanf("%d",&n)!=EOF){int a[n+1],len[n+1];for(int i=0;i<n;i++)scanf("%d",&a[i]);len[0]=1;int lens=1,mid;len[0]=a[0];for(int i=1;i<n;i++){int left=0;int right=lens;while(left<right){mid=(left+right)/2;if(len[mid]<a[i])left=mid+1;elseright=mid;}len[left]=a[i];if(left>=lens)lens++;}printf("%d\n",lens);}return 0;
}

1299最长上升子序列相关推荐

  1. 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr...

    问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  2. 最长连续子序列nlogn算法

    最长上升子序列(LIS)长度的O(nlogn)算法 标签: 算法search优化存储 2012-04-18 19:38 14031人阅读 评论(5) 收藏 举报  分类: 资料学习(15)  解题报告 ...

  3. leetcode-300 最长上升子序列

    题目描述: 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度 ...

  4. 【动态规划】最长公共子序列与最长公共子串

    1. 问题描述 子串应该比较好理解,至于什么是子序列,这里给出一个例子:有两个母串 cnblogs belong 比如序列bo, bg, lg在母串cnblogs与belong中都出现过并且出现顺序与 ...

  5. POJ 3080 多个串最长公共子序列

    求多个串最长公共子序列,字典序最小输出.枚举剪枝+kmp.比较简单,我用find直接查找16ms #include<iostream> #include<string> #in ...

  6. java实现最长连续子序列_最长公共子序列 ||

    问题:在 前一篇文章 最长公共子序列 | 的基础上要求将所有的最长公共子序列打印出来,因为最长公共子序列可能不只一种. 难点:输出一个最长公共子序列并不难,难点在于输出所有的最长公共子序列,我们需要在 ...

  7. 动态规划——最长上升子序列问题 两种角度及优化算法

    最长上升子序列 OpenJ_Bailian - 2757 一个数的序列 bi,当 b1 < b2 < ... < bS的时候,我们称这个序列是上升的.对于给定的一个序列( a1, a ...

  8. 动态规划—最长公共子序列问题 HDU-1159 Common Subsequence

    动态规划-最长公共子序列问题 Common Subsequence [ HDU - 1159 ] A subsequence of a given sequence is the given sequ ...

  9. 最长递增子序列的两种解法

    以LeetCode-300为例: O(n^2)解法: dp数组表示以i结尾的最长递增子序列的长度 class Solution { public:int lengthOfLIS(vector<i ...

  10. 触类旁通,经典面试题最长公共子序列应该这么答

    作者 |  labuladong 来源 | labuladong(ID:labuladong) [导读]最长公共子序列(Longest Common Subsequence,简称 LCS)是一道非常经 ...

最新文章

  1. centos7搭建需密码登入的简易ftp服务器
  2. C#只能lock 引用类型的值 (转载)
  3. [uEnv.txt]在uEnv.txt文件中使用if语句实现Image/dtb文件切换
  4. unity开宝箱动画_[技术博客]Unity3d 动画控制
  5. 北斗导航 | GNSS技术在自动驾驶中的作用
  6. 安装DNN时可能出现的错误
  7. dubbo服务提供与消费
  8. GIT学习笔记2--基本使用
  9. Navicat安装(图文教程)
  10. 【渝粤教育】电大中专药事管理与法规 (2)_1作业 题库
  11. mysql自动去重_关于mysql自联去重的一些记录
  12. linux命令mvn,Linux下使用mvn命令(maven)
  13. linux日志删除了还能恢复吗,Linux系统中恢复被删除日志的方法
  14. C# 如何插入、编辑和删除Excel批注
  15. 桌面下雪小程序 WIN32
  16. 华为hcia-datacom 学习日记
  17. 人脸识别门禁的那些“坑”,你中招了吗?
  18. Sun正式启动Orbit:openlaszlo的JavaME运行时目标
  19. 如何用CMake编译从github上下载的源码
  20. C语言的文件读取与写入操作

热门文章

  1. 图灵社区python kindle_推送mobi至Kindle流程说明(简要操作)
  2. 中兴新支点操作系统_中兴新支点国产操作系统体验如何?笔者告诉你
  3. Mac 借用工具删除顽固软件、清除它在开机启动项的内容
  4. deepfacelab安卓版_DeepFaceLab2020版本下载
  5. 大数据软件有哪些,一网打尽
  6. 自己的旧手机做html服务器,旧手机改座机_怎么将手机改成为座机
  7. Android 不透明度值换算
  8. 我的毕业生涯至从零开始从事编程开发
  9. python处理xps文件_xps/pdf/png/json转换
  10. 操作系统实验七:动态分区分配方式的模拟