LIS:最长上升子序列,常规的dp解法,时间复杂度为O(N^2)
常规解法传送门:https://blog.csdn.net/tb_youth/article/details/89354053
下面我要介绍的是更快的解法:
前提是不需要输出这个最长子序列,只需确定最长子序列的长度;
解释:
基于贪心策略,为了得到一个最长的上升子序列,前面的数越小,对后面上升子序列的长度就越有利

只需要模拟一个栈,最终结果为栈的长度,先把第一个元素压入栈,对于后面的元素,只需要 先比较栈顶元素,如果比栈顶元素大就直接压入栈,否则,在栈中 二分查找 第一个 比此时这个元素 大的元素,将 这个元素位置上的值 替换为 当前元素值,替换这一步就使前面的元素更小了,替换位置前的数没有影响,替换位置上的数替换为当前数明显是有利于后面上升子序列的增长(判断当前元素时,栈内元素都是在此元素前面的)。
举个栗子:
对于 (3, 1,3, 2,5,1, 6)
栈s:(为了方便从是s[1]开始,如果从s[0]开始,最终结果要+1)
先把第1个元素压入栈,s[1] = 3;
从第2个元素1开始:
栈顶:s[1]
1 < s[1]
在栈中s(3),查找第一个大于它的元素:
此时找到的为s[1]
替换:s[1] = 1
栈中变为s(1)
(这里可以明显看出更小的在前面更有利嘛)
第3个元素3:
3 > s[1]
直接压栈s[2] = 3
栈顶更新为s[2],
s(1,3)
第4个元素2:
2 < s[2]
在栈中s(1,3)找第一个大于它的数,
找到的为s[2]
s[2]替换,s[2] = 2
栈中变为:s(1,2)
继续:
第五个元素5
5 > s[2]
直接压入,s[3] = 5
s(1,2,5)
第六个元素1
1 < s[3]
在栈中s(1,2,5)查找第一个大于它的数s:
查到为s[2]
s[2] = 1
栈中变为:s(1,1,5)
第七个元素6,
6 > s[3]
直接压入栈,s(1,1,5,6)
结束。
最终在栈中的元素虽然不是对应的最长子序列,
但是我们每一步操作都让我们后面增长递增子序列更有利。
所以最终的长度一定是ans.

长度为4,ans = 4
代码:

//贪心策略。O(NlogN)解法#include <stdio.h>int a[1005],s[1005];int main(){int n;scanf("%d",&n);int t = 0,l,r,m;for(int i = 1; i <= n; i++){scanf("%d",&a[i]);}s[++t] = a[1];for(int i = 2; i <= n; i++){if(a[i] > s[t]){s[++t] = a[i];}else{l = 1,r = t;//二分查找第一个大于a[i]的位置(也可以直接用upper_bound)//对于二分,这里一定是l<=r,why?如果换成<,在1,2,3中,二分找2你就会明白while(l <= r) {m = (l+r)/2;if(a[i] > s[m]){l = m + 1;}else{r = m - 1;}}s[l] = a[i];}}printf("%d\n",t);return 0;}

LIS(基于贪心的O(NlogN)解法)相关推荐

  1. 最长公共子序列(LCS)问题算法详解+例题(转换成LIS,优化为O(nlogn),看不懂你来打我)

    目录 最长公共子序列(LCS)问题 1.朴素做法 O(n2)O(n^2)O(n2) 2.转换成LIS优化O(nlogn)O(nlogn)O(nlogn) 3.P2758 编辑距离 最长公共子序列(LC ...

  2. 算法经典“钓鱼”问题详解 基于贪心算法 C语言描述

    算法经典"钓鱼"问题详解 基于贪心算法 初始条件 在一条水平路边,有 n 2 ≤ n ≤ 25个钓鱼池,从左到右编号为1.2.3.--.n.小明有H1 ≤ H ≤ 16个小时的空余 ...

  3. 商汤提基于贪心超网络的One-Shot NAS,达到最新SOTA | CVPR 2020

    出品 | AI科技大本营(ID:rgznai100) 导读:在CVPR 2020上,商汤移动智能事业群-3DAR-身份认证与视频感知组提出了基于贪心超网络的One-Shot NAS方法,显著提升了超网 ...

  4. 商汤提基于贪心超网络的One-Shot NAS,达到最新SOTA | CVPR 2020

    出品 | AI科技大本营(ID:rgznai100) 导读:在CVPR 2020上,商汤移动智能事业群-3DAR-身份认证与视频感知组提出了基于贪心超网络的One-Shot NAS方法,显著提升了超网 ...

  5. 背包问题 贪心算法 java_JS基于贪心算法解决背包问题

    前面我们分享了关于js使用贪心算法解决找零问题,本文我们接着为大家介绍JS基于贪心算法解决背包问题. 贪心算法:在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,他所做 ...

  6. matlab 电力系统分析 毕设,基于MATLAB的P-Q分解法电力系统潮流计算毕业设计

    基于MATLAB的P-Q分解法电力系统潮流计算毕业设计 摘 要 电力系统潮流计算是研究电力系统稳定运行情况的一种重要的计算,在电力系统规划设计和现有电力系统运行方式的研究中,都需要利用它来定量地分析比 ...

  7. 转载︱案例 基于贪心算法的特征选择

    本文转载于R语言中文社区,详情链接 相关帖子 转载︱案例 基于贪心算法的特征选择 用GA算法设计22个地点之间最短旅程-R语言实现 ---------------------------------- ...

  8. 【基于贪心的树型动态规划】【NOI2007】追捕盗贼

    问题描述 魔法国度 Magic Land 里最近出现了一个大盗 Frank,他在 Magic Land 四处作案,专门窃取政府机关的机密文件(因而有人怀疑 Frank 是敌国派来的间谍). 为了捉住 ...

  9. 装箱问题c语言函数,C语言基于贪心算法解决装箱问题的方法

    本文实例讲述了C语言基于贪心算法解决装箱问题的方法.分享给大家供大家参考,具体如下: 问题描述: 有一些箱子,容量为V,同时有n个物品,每个物品有一个体积(小于等于箱子容量),要求将物品全部装入箱子中 ...

最新文章

  1. 深度学习--TensorFlow(6)神经网络 -- 拟合线性函数非线性函数
  2. javascript DOM 编程艺术----笔记
  3. html自动广告业代码,html+javascript实现广告窗自由浮动
  4. IE6 png背景图片显示不正常处理
  5. python3的float数精度_Python numpy 浮点数精度问题
  6. Django创建第一个应用
  7. 期刊计算机仿真地址在哪,计算机仿真杂志社地址
  8. dom4j解析xml获取所有的子节点并放入map中
  9. docker容器下mysql主从配置
  10. 随机存储器(RAM),只读存储器(ROM),高速缓存(CACHE),内存,硬盘,CPU
  11. 北京的三甲医院都是定点医院吗?不列入医保卡范围不能报销?
  12. 悉尼大学USYD2022S2// INFO1110// Week2 lecture2a: Variables and Data types
  13. VP9编码器客观及主观质量优化
  14. 蔡氏电路matlab,基于MATLABSimulink的蔡氏电路研究(Simulink搭建仿真系统)
  15. 寒江独钓——Windows内核安全编程
  16. 使用李跳跳·自动关闭运动校园广告
  17. 4、判断一个年份是否为闰年。(闰年即满足以下两条件的年份:其一:能被4整除但不能被100整除;其二:能被400带除)
  18. 在10万以内的一个整数,它加上 100 后是一个完全平方数,再加上 168 又是一个完全平方数,请问该数是多少?
  19. 再谈数字化转型的基本认识、重点和策略
  20. oxcdcdcdcd是什么?

热门文章

  1. python文本框清空_用Python制作mini翻译器
  2. sed 中如何替换换行符
  3. 四十二、ETL工具Kettle的转换步骤
  4. 做 SQL 性能优化真是让人干瞪眼
  5. 下一代Windows系统,Win11来了
  6. 富学金融穷学IT,分析互联网的新财富密码
  7. 周志华“西瓜书”啃不动?来试试这个!详细公式推导,上万好评
  8. c++ list 修改_Cpython源码阅读17-list自动扩容原理
  9. asp.netcore oracle,Asp.net core 3.1+EF Core2.2.6+Oracle.EntityFrameworkCore2.1.19连接Oracle数据库...
  10. 信息论-Shannon entropy-Kullback-Leibler (KL) divergence-cross-entropy