最长递增子序列 两种做法

这里给一个例题,理解完可以做一做。HRBUST-1835

复杂度为\(O(N^2)\)做法

采用动态规划的做法

有一个长度为N的数组{a0, a1, a2, a3, ... , an-1},我们假定以aj结尾的数组序列的最长递增子序列长度为dp[j],那么dp[j]=max(dp[i]+1, i<j 并且a[i]<a[j])。我们需要遍历j之前所有位置的i,找出这个这个最大的值。

其他详细细节看代码实现。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>using namespace std;
const int N=1e3;
int a[N];
int dp[N];
int main()
{int n;while(scanf("%d", &n)!=EOF){for(int i=0; i<n; i++){scanf("%d", &a[i]);dp[i]=1; //每个需要初始化为1,因为每一个都可以自己成为一个最短的子序列}int ans=1;//答案最小是1for(int i=1; i<n; i++){for(int j=0; j<i; j++){if(a[j]<a[i] && dp[j]+1 > dp[i]) //这里需要满足两个条件,前面的数值小于a[i],并且加上这个序列后能够使得dp[i]增加。{         dp[i]=dp[j]+1;}}ans=max(ans, dp[i]);//这里求出dp中的最大值。}printf("%d\n", ans);}return 0;} 

复杂度为\(O(N*lgN)\)的算法

对于一个长度为n的递增序列,我们想让这个序列结尾的数值尽可能的小,因为只有这样当我们想要往后面添加数字时,这个数字可以比较小。

过程是这样的。

假设存在一个序列d[1..9] ={ 2,1 ,5 ,3 ,6,4, 8 ,9, 7},可以看出来它的LIS长度为5。下面一步一步试着找出它。
我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列。此外,我们用一个变量Len来记录现在最长算到多少了

首先,把d[1]有序地放到B里,令B[1] = 2,就是说当只有1一个数字2的时候,长度为1的LIS的最小末尾是2。这时Len=1

然后,把d[2]有序地放到B里,令B[1] = 1,就是说长度为1的LIS的最小末尾是1,d[1]=2已经没用了,很容易理解吧。这时Len=1

接着,d[3] = 5,d[3]>B[1],所以令B[1+1]=B[2]=d[3]=5,就是说长度为2的LIS的最小末尾是5,很容易理解吧。这时候B[1..2] = 1, 5,Len=2

再来,d[4] = 3,它正好加在1,5之间,放在1的位置显然不合适,因为1小于3,长度为1的LIS最小末尾应该是1,这样很容易推知,长度为2的LIS最小末尾是3,于是可以把5淘汰掉,这时候B[1..2] = 1, 3,Len = 2

继续,d[5] = 6,它在3后面,因为B[2] = 3, 而6在3后面,于是很容易可以推知B[3] = 6, 这时B[1..3] = 1, 3, 6,还是很容易理解吧? Len = 3 了噢。

第6个, d[6] = 4,你看它在3和6之间,于是我们就可以把6替换掉,得到B[3] = 4。B[1..3] = 1, 3, 4, Len继续等于3

第7个, d[7] = 8,它很大,比4大,嗯。于是B[4] = 8。Len变成4了

第8个, d[8] = 9,得到B[5] = 9,嗯。Len继续增大,到5了。

最后一个, d[9] = 7,它在B[3] = 4和B[4] = 8之间,所以我们知道,最新的B[4] =7,B[1..5] = 1, 3, 4, 7, 9,Len = 5。

于是我们知道了LIS的长度为5。

最后这个B数组中存的数是对应的长度的LIS的最小末尾,就是同样长度的子序列,末尾数值最小的那个。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=107;
int a[maxn];
int main()
{int n;while(scanf("%d", &n)!=EOF){for(int i=1; i<=n; i++){scanf("%d", &a[i]);}int len=1, pos;for(int i=2; i<=n; i++)//这里我没有用两个数组,因为使用原来的数组也可以{pos=lower_bound(a+1, a+len+1, a[i])-a; //这里使用了lower_bound函数来进行查找第一个小于等于a[i]的数字if(pos>len)//如果位置大于了len长度的时候需要len++len++;a[pos]=a[i];}printf("%d\n", len);} return 0;} 

参考文章

点击这里

转载于:https://www.cnblogs.com/alking1001/p/11537203.html

最长递增子序列 两种做法相关推荐

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

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

  2. 最长递增子序列的三种算法

    转载自:http://qiemengdao.iteye.com/blog/1660229 最长递增子序列 问题 给定一个长度为N的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱).例如 ...

  3. 最长递增子序列(LIS)

    最长递增子序列(LIS) 问题描述: 求一个序列的最长递增子序列,这样的子序列是允许中间越过一些字符的,即留"空". 例如:4 2 3 1 5 的最长递增子序列为 2 3 5,长度 ...

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

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

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

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

  6. 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

    最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续子序列.比如{5,-3,4,2}的最大子序列就是 {5,-3,4,2},它的和是8,达到最大:而 {5,-6,4,2}的最大子序列是{4, ...

  7. 最长递增子序列 最长连续递增序列

    引言 这两道题有很大的相似性,在这里主要的地方就是循环的设置,不仅仅适用于这两道题,在很多类似的题目中都可以用到,要学会相应的方法才行: 最长递增子序列 给你一个整数数组 nums ,找到其中最长严格 ...

  8. [codevs 1906] 最长递增子序列问题

    1906 最长递增子序列问题 题解: 第一问是普通的DP,同时为后面做铺垫. 后面的在<线性规划与网络流24题>里说的要比我好,引用来: 第一问动态规划已经求出F[i],表示以第i位为开头 ...

  9. 最长递增子序列_python_算法与数据结构

    周末了,实验室的网速还是不给力啊,不知道doctors都在干啥,,,最近都在做算法作业,昨天晚上看了一部电影<将爱进行到底>,刚打开电影没多久就听到了很熟悉的旋律,让我很是惊讶,这竟然就是 ...

  10. 最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和...

    最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和 文章作者:Yx.Ac   文章来源:勇幸|Thinking (http://www.ahathi ...

最新文章

  1. mysql 主从 MySQLroute_mysql主从复制
  2. c++编译器pointer to a function used in arithmetic的解决办法
  3. centos7 VNC-Server-6.7.2
  4. percona-xtrabackup-8.0.7简单快捷使用
  5. HttpClient 调用WebAPI时—传参的三种方式(ASP.NET MVCCORE均适用)
  6. windows安装vnm
  7. 推荐系统-协同过滤原理与实现
  8. 你所学的专业是怎么回事——摄影测量与遥感
  9. 阿里云商标注册入口(附商标申请流程)
  10. 国美易卡取得长足发展,国美易卡NVIDIA深度学习
  11. 举头望明月打计算机术语,关于月亮的谜语
  12. Web前端如何快速的兼容手机
  13. Windows Phone7屏幕方向与常用控件
  14. Warning: Failed prop type: Invalid prop `enablesReturnKeyAutomatically` of type `string` supplie
  15. Niagara N4 与物联网的学习经验分享(二 照明控制)
  16. kafka的生产者如何把消息发送到指定分区里
  17. Y7000 2018版(I7-8650H 1050T)黑苹果安装攻略附带工具安装包
  18. 阿里妈妈技术:广告间排序和广告内创意优选联合优化(CACS)
  19. 计算机桌面截图怎么截,电脑如何截图,教您电脑截图怎么截
  20. sprintf在c语言中的作用,c语言中sprintf的用法

热门文章

  1. 【Feign源码】解析方法的类--Contract
  2. Spring AOP实现及运行期调用原理分析
  3. jsp三大指令(总结)
  4. ASCII、Unicode、UTF、base64
  5. weex 项目开发(五)自定义 过滤函数 和 混合 及 自定义 Header 组件
  6. html5 jquery音乐播放器,play()和pause()不起作用
  7. 【12.2新特性】Oracle Sharding分片级别的高可用实现
  8. 删除指定天数文件,再删除所有的空目录批处理文件
  9. 58、IPv6访问控制列表及ICMPv6简介
  10. Postgresql基础操作2-导入数据