51nod 1134最长递增子序列
给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)
第1行:1个数N,N为序列的长度(2 <= N <= 50000) 第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)
输出最长递增子序列的长度。
8 5 1 6 8 2 4 5 10
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最长递增子序列相关推荐
- 51Nod:1134 最长递增子序列
动态规划 修改 隐藏话题 1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出长度为N的数组,找出这个数组的最长递增子序列.( ...
- [51Nod 1218] 最长递增子序列 V2 (LIS)
传送门 Description 数组A包含N个整数.设S为A的子序列且S中的元素是递增的,则S为A的递增子序列.如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS).A的LIS可 ...
- 1134 最长递增子序列(时间复杂度O(n*log(n))
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 ###Description 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) ...
- 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的长度 ...
- 51Nod-1134 最长递增子序列【LIS】
1134 最长递增子序列 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 给出长度为N的数组,找出这个数组的最长递增子序列.(递增子序列是指,子序列的元素是递增的) 例如 ...
- 51nod1134最长递增子序列(dp)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1134 这里说下,最长上升子序列和最长不降子序列几乎一样,只是判 ...
- 最长递增子序列的两种解法
以LeetCode-300为例: O(n^2)解法: dp数组表示以i结尾的最长递增子序列的长度 class Solution { public:int lengthOfLIS(vector<i ...
- 最长递增子序列问题的求解
一, 最长递增子序列问题的描述 设L=<a1,a2,-,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,-,akm>,其中k1<k2 ...
- 编程之美2.16 最长递增子序列
这道题目要求返回一个数字,这个数字代表一个数组中最长的递增子序列,当然,不要求这个序列是连续的,比如,有这样一个数组:{1, 3,5,7, 2, 9},那么这个数组的最长递增子序列就是5, ...
- 洛谷P2766-最长递增子序列问题
chunlvxiong的博客 题目描述: 给定正整数序列x1,...,xn (1≤n≤500). 1.计算其最长递增子序列的长度s. 2.计算从给定的序列中最多可取出多少个长度为s的递增子序列. 3. ...
最新文章
- java使用jeids实现redis2.6的String操作(1)
- 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 插件标记实现
- 蚂蚁金服发布「定损宝」,推动图像定损技术在车险领域的应用
- python怎么设置函数超时时间_在python运行时为函数设置超时秒数
- libmysqld_dev linux,解决mysql安装mysqld doesn\'t exist or is not-鸟哥のlinux-ChinaUnix博客
- elementUI组件el-dropdown - 踩坑篇
- Python版组合数计算方法优化思路和源码
- Ubuntu20.04之安装VirtualBox虚拟机
- iframe框架_性能优化去除iframe脚手架升级方案
- 局域网快速传输数据(大量文件)
- Python爬取网易云歌词并生成词云
- windows禅道官网地址及环境搭建
- 童年经典,任天堂switch红白机游戏
- 小工具:输出Houdini里节点间参数的差别
- **51 stm8 arduino esp8266 esp32 stm32 树莓派 等单片机使用对比**
- 如何找到能商用的背景纯音乐
- 语雀(专业的云端知识库)
- fastlane 上传到蒲公英和Fir 配置
- python dynamic
- 2022天梯L1-L2题解
热门文章
- Bugku-Web-速度要快-WriteUp
- lvs+keepalived实现负载均衡和高可用
- 一个实例明白AutoResetEvent和 ManulResetEvent的用法
- Visual Paradigm 教程[UML]:如何在UML中绘制组件图?
- [清华集训2016]温暖会指引我们前行——LCT+最大生成树
- tortoisegit 还原到某个版本
- 【 js 基础 】Javascript “继承”
- TZOJ 1072: 编辑距离(动态规划)
- linux 忘记mysql密码的解决办法
- wp8 应用推荐photobeamer