给出长度为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

动态规划题目,可以令dp[i]为,以ai为末尾的最长上升子序列的长度。则当i > j,dp[i] > dp[j] dp[i] = max(dp[i],dp[j]+1);
 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <algorithm>
 5 using namespace std;
 6 const int Inf = 1<<30;
 7 const int MAX = 50010;
 8 int a[MAX], dp[MAX];
 9 int main(){
10     int n;
11     for(int i = 0; i < MAX; i ++)dp[i] = 0;
12     scanf("%d",&n);
13     for(int i = 0; i < n; i ++)scanf("%d",&a[i]);
14     int res = 0;
15     for(int i = 0; i < n; i ++){
16         dp[i] = 1;
17         for(int j = 0; j < i; j ++){
18             if(a[j] < a[i]){
19                 dp[i] = max(dp[i],dp[j]+1);
20             }
21         }
22         res = max(dp[i],res);
23     }
24     printf("%d\n",res);
25     return 0;
26 }

不过由于N最大是50000,用上面的方法肯定会超时的,这是可以用到lower_bound这个函数。用二分的方法,时间复杂度是nlog(n)。

 1 #include <iostream>
 2 #include <stdio.h>
 3 #include <string.h>
 4 #include <algorithm>
 5 using namespace std;
 6 const int Inf = 1<<30;
 7 const int MAX = 50010;
 8 int a[MAX], dp[MAX];
 9 int main(){
10     int n;
11     for(int i = 0; i < MAX; i ++)dp[i] = Inf;
12     scanf("%d",&n);
13     for(int i = 0; i < n; i ++)scanf("%d",&a[i]);
14     for(int i = 0; i < n; i ++){
15         *lower_bound(dp,dp+n,a[i]) = a[i];
16     }
17     printf("%d\n",lower_bound(dp,dp+n,Inf)-dp);
18     return 0;
19 }

转载于:https://www.cnblogs.com/xingkongyihao/p/7201069.html

51nod 1134最长递增子序列相关推荐

  1. 51Nod:1134 最长递增子序列

    动态规划 修改 隐藏话题 1134 最长递增子序列  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出长度为N的数组,找出这个数组的最长递增子序列.( ...

  2. [51Nod 1218] 最长递增子序列 V2 (LIS)

    传送门 Description 数组A包含N个整数.设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS).A的LIS可 ...

  3. 1134 最长递增子序列(时间复杂度O(n*log(n))

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

  4. 51nod 1376 最长递增子序列的数量(dp、CDQ分治 | BIT)

    题意: N≤5×104的序列,0≤Ai≤109,求LIS的数量N\le5\times10^4的序列, 0\le A_i\le 10^9, 求LIS的数量 分析: f[i]:以第i个数结尾的LIS的长度 ...

  5. 51Nod-1134 最长递增子序列【LIS】

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

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

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134 这里说下,最长上升子序列和最长不降子序列几乎一样,只是判 ...

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

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

  8. 最长递增子序列问题的求解

    一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1<k2 ...

  9. 编程之美2.16 最长递增子序列

          这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5, ...

  10. 洛谷P2766-最长递增子序列问题

    chunlvxiong的博客 题目描述: 给定正整数序列x1,...,xn (1≤n≤500). 1.计算其最长递增子序列的长度s. 2.计算从给定的序列中最多可取出多少个长度为s的递增子序列. 3. ...

最新文章

  1. java使用jeids实现redis2.6的String操作(1)
  2. 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 插件标记实现
  3. 蚂蚁金服发布「定损宝」,推动图像定损技术在车险领域的应用
  4. python怎么设置函数超时时间_在python运行时为函数设置超时秒数
  5. libmysqld_dev linux,解决mysql安装mysqld doesn\'t exist or is not-鸟哥のlinux-ChinaUnix博客
  6. elementUI组件el-dropdown - 踩坑篇
  7. Python版组合数计算方法优化思路和源码
  8. Ubuntu20.04之安装VirtualBox虚拟机
  9. iframe框架_性能优化去除iframe脚手架升级方案
  10. 局域网快速传输数据(大量文件)
  11. Python爬取网易云歌词并生成词云
  12. windows禅道官网地址及环境搭建
  13. 童年经典,任天堂switch红白机游戏
  14. 小工具:输出Houdini里节点间参数的差别
  15. **51 stm8 arduino esp8266 esp32 stm32 树莓派 等单片机使用对比**
  16. 如何找到能商用的背景纯音乐
  17. 语雀(专业的云端知识库)
  18. fastlane 上传到蒲公英和Fir 配置
  19. python dynamic
  20. 2022天梯L1-L2题解

热门文章

  1. Bugku-Web-速度要快-WriteUp
  2. lvs+keepalived实现负载均衡和高可用
  3. 一个实例明白AutoResetEvent和 ManulResetEvent的用法
  4. Visual Paradigm 教程[UML]:如何在UML中绘制组件图?
  5. [清华集训2016]温暖会指引我们前行——LCT+最大生成树
  6. tortoisegit 还原到某个版本
  7. 【 js 基础 】Javascript “继承”
  8. TZOJ 1072: 编辑距离(动态规划)
  9. linux 忘记mysql密码的解决办法
  10. wp8 应用推荐photobeamer