写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步!

最长单调递增子序列

【题目描述】
找出由n个数组成的序列中的最长单调递增子序列及其长度。

【O(n*n)算法解题思路】
思路一:用数组 b[0:n-1]记录以a[i] (0≤i<n) 为结尾元素的最长递增子序列的长度。序列a的最长递增子序列的长度为max {b[i]} (0≤i<n) 。易知,b[i]满足最优子结构性质,可以递归定义为:b[0]=1, b[i]=max{b[k]}+1(0≤k≤i)。
思路二:将原问题转化为求最长公共子序列问题,求原序列和升序排序后序列的最长公共子序列。

【O(nlogn)算法解题思路】
用归纳解此问题。归纳假设是:已知计算序列a[0:i-1] (i<n)的最长递增子序列的长度的正确算法。从初始情况开始,对于长度为n的序列a[0:n-1],设法转换为求长度小于n的序列的最长递增子序列的长度。
定义P:(0≤i<n) k是序列a[0:i]的最长递增子序列的长度; b[K]是序列a[0:i]中所有长度为k的递增子序列中的最小结尾元素值。若w等于某一个b[k]的值,则pre[w]用于存储排在w前面的所有长度为k-1的递增子序列中的最小结尾元素值。
具体解题步骤如下:
在由i-1到i的循环中,
①当a[i]>b[k]时,k=k+1, b[k]=a[i],否则k值不变。
②当a[i]≤b[k]时,如果a[i]<b[1].则将b[1]的值改变为a[i]。当b[1]≤a[i]≤b[k]时,用二分搜索算法找到有序的数组b下标j,使得b[i-1]≤a[i]<b[j]。b[j-1]<a[i]<b[j]时, b[1:j-1]和b[j+1:k]的值不变, b[j]的值改变为a[i]。b[j-1]==a[i]时,保持不变。
③对于记录最长递增子序列,可在求得每一个b[j]时用pre[b[i]]记录b[j]的前驱数据为b[j-1],即排在b[j]前面的序列a[0:i-1]的所有长度为j-1的递增子序列中的最小结尾元素值。

【解题过程遇到的问题】
问:为什么步骤的第②点中当b[j-1]==a[i]时要保持不变?
答:来个例子,比如序列1 2 3 2,当i递增到3时,发现a[i]==b[2],但如果将b[3]改为a[i],这会得到2是长度为3的递增子序列中的最小结尾元素值,这虽然不影响求得原序列的最长单调递增子序列长度为3,但如果要根据数组b来记录最长单调递增子序列则行不通,因为将b[3]改为2后已不满足b[k]的定义,2并不是a[0…3]中长度为3的单调递增子序列的最小结尾值,2,2不构成递增关系。

【样例解答】


【实现代码】

#include <bits/stdc++.h>
using namespace std;
int a[101]={0};
int b[101]={0};
int pre[101]={0};
int n;
stack <int> S;
//k是序列a[0:i]的最长递增子序列的长度
//b[k]是序列a[0:i]中所有长度为k的递增子序列中的最小结尾元素值
//假若w等于某一个b[k],则pre[w]存排在w前面的所有长度为k-1的递增子序列中的最小结尾元素值
int binary(int i,int k)
{int u=k;if(a[i]<b[1]){return 1;}//二分法查找满足b[j-1]<=a[i]<b[j]的jfor(int h=1,j=k;h!=j-1;){if(b[k=(h+j)/2]<=a[i])h=k;elsej=k;u=j;}return u;
}
int LIS()
{int v;b[1]=a[0];for(int i=1,k=1;i<n;i++){if(a[i]>b[k])//a[i]>b[k]{b[++k]=a[i];pre[a[i]]=b[k-1];}else//a[i]≤b[k]{int m=binary(i,k);if(a[i]!=b[m-1]){pre[a[i]]=b[m-1];b[m]=a[i];}}v=k;}return v;
}
int main()
{cin>>n;for(int i=0;i<n;i++){cin>>a[i];}int res=LIS();cout<<res<<endl;int index=b[res];S.push(index);while(pre[index]!=0){S.push(pre[index]);index=pre[index];}while(!S.empty()){cout<<S.top()<<' ';S.pop();}return 0;
}
/*
15
7 2 5 6 3 4 9 8 12 13 26 14 30 20 21
*/
/*
7
2 4 3 5 6 4 8
*/
/*
8
12 13 14 1 2 3 2 4
*/

最长单调递增子序列(时间复杂度O(nlogn))相关推荐

  1. 最长单调递增子序列O(NlogN)算法

     O(NlgN)算法 假设存在一个序列d[1..9] ={ 2,1 ,5 ,3 ,6,4, 8 ,9, 7},可以看出来它的LIS长度为5.  下面一步一步试着找出它.  我们定义一个序列B,然后 ...

  2. 最长单调递增子序列 [转]

    [转] http://skynewborn.blog.sohu.com/66594610.html 单调子序列包含有单调递增子序列和递减子序列,不失一般性,这里只讨论单调递增子序列.首先,从定义上明确 ...

  3. 最长单调递增子序列 动态规划 (java)

    题目描述: 设计一个O(N^2)算法,找出n个数据组成的序列的最长单调递增子序列. 输入示例: 8 1 2 3 -9 3 9 0 11 输出示例: 5 1 2 3 9 11 设计思路: 有一个数组 a ...

  4. 最长单调递增子序列 python_最长单调递增子序列

    前面三篇博客分别讲了贪心,递归,分治,今天就说个简单的动态规划(DP)的题目吧.在我心中DP算是比较难的算法,尤其像状态DP,树形DP,因为实力问题就说一个简单的线性DP--最长单调递增子序列. 题目 ...

  5. java最长单调递增子序列_最长单调递增子序列问题

    最长单调递增子序列问题 题目:设计一个 O( n ^ 2 )复杂度的算法,找出由 n 个数组成的序列的最长单调递增子序列. import java.util.Scanner; public class ...

  6. 输出最长单调递增子序列java_动态规划实现最长单调递增子序列

    1. 实验环境 操作系统:Mac 64 运行内存:16GB 编程语言:Java 编译环境:Eclipse 2. 题目要求 设计一个Ο(nlgn)时间的算法,求一个 n 个数的序列的最长单调递增子序列. ...

  7. 动态规划作业 最长单调递增子序列

    动态规划作业 1.最长单调递增子序列 设计一个 O(n2)时间的算法,找出由 n 个数组成的序列 a 的最长单调递增子序列. 提示: 用数组 b[0:n]纪录以 a[i] (0<= i< ...

  8. 最长单调递增子序列--动态规划

    最长单调递增子序列定义: 问题描述: 设计一个O(n2)时间的算法, 找出由n个数组成的序列的最长单调递增子序列. 输入 第1个整数n(0<n<100),表示后面有n个数据,全部为整数. ...

  9. 算法实验-最长单调递增子序列长度

    问题描述 解决思路 O(n^2) 首先考虑使用动态规划的方法解决该问题.首先将原问题分解为子问题.对于长度为n的序列(从下标1开始),假设前n-1个元素形成了n-1个以arr[i]结尾的单调递增最长子 ...

最新文章

  1. BSCI—8-(2):OSPF的特殊区域类型与配置
  2. CentOS系统dig和nslookup的安装
  3. 《构建之法》读书笔记
  4. 面试让你手撕红黑树?30张图带你彻底理解红黑树~
  5. 空间谱专题02:波束形成(Beamforming)
  6. 品牌推广前期要进行哪些针对性的步骤?
  7. CentOS6.5+Python2.7+ GIT +IPython
  8. sql crud_使用适用于SQL Server的Python SQL库执行CRUD操作
  9. Python 黑帽子 netcat工具python3实现
  10. SpringBoot调用腾讯云短信服务
  11. Flutter Connection to **** was not upgraded to websocket
  12. 代理IP是什么意思?浏览器代理和代理服务器是什么(小白必看,看了必会,不看血亏)
  13. 灵遁者第一部诗歌集《触摸世界》上集40首诗歌欣赏
  14. 【读书笔记】《码农翻身》——一本差点被书名耽误的好书
  15. Connections could not be acquired from the unde...
  16. 1、NVIDIA Quadro P600 Linux显卡驱动安装
  17. 什么是抽象类?抽象类有什么特点?举例说明抽象类及其成员的定义方法。
  18. 实验4-1-12 黑洞数 (20 分)
  19. 《构建之法》学习总结1——软件工程概论,团队组织及管理,开发流程
  20. 金蝶系统更换服务器怎么操作系统,换主机金蝶服务器怎么安装

热门文章

  1. 北京租赁住房用地分布,八张大数据图表让你一目了然!
  2. 西门子PLC连接SimatcNet OPC服务器
  3. 用udp实现可靠传输python_一种基于UDP协议实时可靠图像传输方案的制作方法
  4. 这些只有程序猿才能看懂的段子,不笑你拿小拳拳捶我
  5. 【备忘】软件安装:word公式编辑器+虚拟打印机doPDF
  6. hnust - 聊天表情
  7. ChatGPT正式开放API,企微接入平台上线
  8. keras实现Deep Dream
  9. 【时代新未来 产业新发展】茉莉元宇宙芯片技术交流会圆满落幕
  10. 基于 JavaSwing 的招生信息管理系统的实现