给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)

例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。

 
Input
第1行:1个数N,N为序列的长度(2 <= N <= 50000)
第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)
Output
输出最长递增子序列的长度。
Input示例
8
5
1
6
8
2
4
5
10
Output示例
5

题意:最经典的最长上升子序列问题,给出了你一个包含n个数的最长上升子序列,要你求出在这个序列中,单调递增的子序列最长为多少?例如:1 9 4 3 5 2 6 7的最长上升子序列为1 3 5 6 7或1 4 5 6 7。
思路:最长上升子序列有几种解法(菜鸟的我只会两种),一种最简单的dp解法是O(n^2),这里用不上。我这里用的是nlogn的。可以声明一个数组dp【1.....n】,dp【i】的意义是什么?它记录的是在整个序列中,长度为 i 的上升子序列末尾元素的最小值。所有如果你当前输入的元素num大于dp【i】,那么你就可以确定当前长度为i+1的上升子序列的末尾元素为num,否则你就要找出dp【1....i】中第一个大于等于num的元素的位置 j,用num来替换dp【j】,这意味着长度为 j 的上升子序列的末尾元素被减小为num了。
而求第一个大于等于num的数的方法可以用二分,因为你在更新dp数组的时候,前面的那些数就是有序的了。当然更简单的可以用《algorithm》中的lower_bound函数,它返回的是有序数组中第一个大于或等于某个数的元素的地址。当所有的元素被输入完后,dp数组下标就是最长上升子序列元素的个数。当然这种方法只能求最长上升子序列元素的个数,无法求出每一个元素是什么。
这一篇博客详细模拟了上面这种方法的每一步,可以看着理解一下:https://blog.csdn.net/fire_to_cheat_/article/details/78297534

代码:
 #include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<string>
#include<cmath>
#include<algorithm>
#include<stack>
#include<queue>
#define ll long long
#define inf 0x3f3f3f3f
#define pi 3.141592653589793238462643383279
using namespace std;
int main()
{
int n,num,dp[];
while(cin>>n)
{
scanf("%d",&num);
dp[] = num;
int cnt = ;
for(int i=; i<n; ++i)
{
scanf("%d",&num);
if(dp[cnt-] < num) dp[cnt++] = num;
else //lower_bound函数求第一个大于等于num的数
{
int p = lower_bound(dp,dp + cnt - ,num) - dp; //数的地址减去基地址等于数组下标
dp[p] = num;
}
/*else // 二分法求第一个大于等于num的数
{
int low = 0,high = cnt-1;
while(low <= high)
{
int mid = (low + high)/2;
if(dp[mid] < num)
low = mid + 1;
else if(dp[mid] > num)
high = mid - 1;
else
{
low = mid;
break;
}
}
dp[low] = num;
}*/
}
cout<<cnt<<endl;
}
}

51nod1134——(最长上升子序列)的更多相关文章

  1. 51nod--1134 最长递增子序列 (动态规划)

    题目: 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行: ...

  2. 51nod1134 最长递增子序列【动态规划】

    给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行:1个数N ...

  3. 51nod-1134 最长递增子序列,用线段树将N^2的dp降到NlogN

    题目链接 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10. Input 第1行 ...

  4. 51nod1134(最长递增子序列)

    题目链接: https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134 题意: 中文题诶~ 思路: 直接暴力的话时间复杂度为 ...

  5. 最长上升子序列LIS(51nod1134)

    1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递 ...

  6. 用python实现最长公共子序列算法(找到所有最长公共子串)

    软件安全的一个小实验,正好复习一下LCS的写法. 实现LCS的算法和算法导论上的方式基本一致,都是先建好两个表,一个存储在(i,j)处当前最长公共子序列长度,另一个存储在(i,j)处的回溯方向. 相对 ...

  7. 动态规划之最长公共子序列(LCS)

    转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...

  8. [Data Structure] LCSs——最长公共子序列和最长公共子串

    1. 什么是 LCSs? 什么是 LCSs? 好多博友看到这几个字母可能比较困惑,因为这是我自己对两个常见问题的统称,它们分别为最长公共子序列问题(Longest-Common-Subsequence ...

  9. 动态规划求最长公共子序列(Longest Common Subsequence, LCS)

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

随机推荐

  1. day 11 前方高能-迭代器

    第一类对象 -----函数名  == 变量名 函数对象可以像变量一样进行赋值 还可以作为列表的元素进行使用 可以作为返回值返回 def wrapper():     def inner():      ...

  2. Python3入门(五)——高级特性

    一.切片 对于取指定索引的值,python提供了切片来简化傻傻的循环 list2 = ["apple", "water", "banana" ...

  3. source insight之quicker.em宏的使用

    source insight有很多宏可以用,这里介绍的宏是quicker.em这个宏,它是华为的一个员工写的,很实用. 1.安装quicker.em宏 一.打开base这个工程Project-> ...

  4. MIT一牛人对数学在机器学习中的作用给的评述

    MIT一牛人对数学在机器学习中的作用给的评述 转载自http://my.oschina.net/feedao/blog/52252,不过这个链接也是转载的,出处已经无从考证了.   感觉数学似乎总是不 ...

  5. AngularJS 的异步服务测试与Mocking

    测试 AngularJS 的异步服务 最近,在做项目时掉进了 AngularJS 异步调用 $q 测试的坑中,直接躺枪了.折腾了许久日子,终于想通了其中的道道,但并不确定是最佳的解决方案,最后还是决定 ...

  6. 开发工具之Spark程序开发详解

    一  使用IDEA开发Spark程序 1.打开IDEA的官网地址,地址如下:http://www.jetbrains.com/idea/ 2.点击DOWNLOAD,按照自己的需求下载安装,我们用免费版 ...

  7. 2019大疆PC软件开发笔试——开关和灯泡两个电路板

    题目描述: 小A是一名DIY爱好者,经常制作一些有趣的东西. 今天,小A突然想要来做这样一个东西.小A现在有两块同样大小为n×m,有n×m块大小为1×1小电路板拼成的矩形电路板,假设叫做电路板A和电路 ...

  8. Git 命令简单罗列

    源教程出自 廖雪峰的官方网站 https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 整 ...

  9. python的闭包函数

    在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用.这样就构成了一个闭包. #闭包函数的实例# outer是外部函数 a和b都是外函数的临时变量def o ...

  10. Apache Ignite 学习笔记(四): Ignite缓存冗余备份策略

    Ignite的数据网格是围绕着基于内存的分布式key/value存储能力打造的.当初技术选型的时候,决定用Ignite也是因为虽然同样是key/value存储,它有着和其他key/value存储系统不 ...