O(NlgN)算法

假设存在一个序列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。

原文出处:原文链接
/*******************最长单调递增子序列**********************/
#include<stdio.h>
#define M 9
void INIT_MAP(int L[]){for(int i=0;i<M;i++){scanf("%d",&L[i]);}
}void procs(const int L[],int B[],int &len){int flag=0;for(int i=1;i<M;i++){printf("执行第%d次\n",i);flag=0;for(int j=0;j<=len;j++){if(L[i]<=B[j]){B[j]=L[i];flag=1;break;}}if(flag==0){B[len+1]=L[i];len++;}}
}
void SHOW(const int array[]){for(int i=0;i<M;i++){printf("%d ",array[i]);}printf("\n");
}
void main(){int L[M];INIT_MAP(L);int B[M]={0};B[0]=L[0];int len=0;procs(L,B,len);printf("长度是%d\n",len);SHOW(L);SHOW(B);
} 

最长单调递增子序列O(NlogN)算法相关推荐

  1. 最长单调递增子序列(时间复杂度O(nlogn))

    写在前面:仅为个人代码/总结,未必标准,仅供参考!如有错误,还望指出交流,共同进步! 最长单调递增子序列 [题目描述] 找出由n个数组成的序列中的最长单调递增子序列及其长度. [O(n*n)算法解题思 ...

  2. 最长递增子序列 O(NlogN)算法

    最长递增子序列 O(NlogN)算法 今天回顾WOJ1398,发现了这个当时没有理解透彻的算法. 看了好久好久,现在终于想明白了. 试着把它写下来,让自己更明白. 最长递增子序列,Longest In ...

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

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

  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. 最长单调递增子序列 动态规划 (java)

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

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

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

最新文章

  1. SQL 存储过程 解析XML
  2. CSS综合复习笔记 01
  3. Codeforces 235B Let's Play Osu!
  4. Swift傻傻分不清楚系列(六)集合类型
  5. 美化博客园 添加网易云音乐及生成文章目录
  6. vfp报表纸张设置_vfp教程之Visual Foxpro生成任意打印字段报表的实现
  7. 【转载】html中自定义字体
  8. 关于CASS点自动连线方法
  9. php项目部署到服务器
  10. 图书管理系统mysql课程设计C_数据库课程设计 图书管理系统 附源代码.doc
  11. Java jdt 编辑_java – 如何使用JDT以编程方式重命名方法
  12. 最大的计算机计数单位,计数单位最大只知道亿?也许更大的计数单位能让你笑出声。...
  13. 虎扑网站服务器垃圾,虎扑拿下域名hupu.com 游击队摇身一变正规军
  14. 前端工程师知识体系结构:
  15. 关于区块链的想法和感想
  16. keyshot渲染玻璃打光_keyshot8耳机渲染打光教程
  17. [Ubuntu 16.04] [Memos] install jupyterlab
  18. 运维总监不会告诉你这些有趣但鲜为人知的 Linux 命令
  19. 计算机操作系统之三:进程与线程的描述与控制
  20. Linux C 以read()读取文件并提取字符串

热门文章

  1. 恐怕我今天不能在计算机上工作英语,英语翻译1、恐怕我现在不能走,因为我还没做完作业.( )i cannot leave now because i hav...
  2. java中GUI中显示当前时间_【java编程】返回当地时间Clock到GUI面板Panel上
  3. 什么是固态功率放大器?射频固态功率放大器?
  4. 笔记本屏幕变暗/调高亮度闪烁修复方法
  5. PYQT5 QGridLayout及setRowStretch、setColumnStretch用法简探
  6. html表格突出显示,java-如何突出显示jtable单元格的文本?
  7. axure8 事件改变样式_【Petrel老师带你玩转Axure 8(二)】Axure部件样式与页面样式管理...
  8. 正易判讀 6-1 韓長庚 著
  9. html5的水墨画,PR怎么做水墨画效果
  10. Access violation reading location 0xccccccc0运行异常的解决方法