最长不下降子序列的O(n^2)算法和O(nlogn)算法
转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法
最长不下降子序列(LIS:Longest Increasing Subsequence)
//用句通俗的话说,我讲的很通俗易懂~~
问题描述:给出n个数,求出其最长不下降子序列的长度,比如n=5,5个数是{4,6,5,7,3};其最长下降子序列就是{4,6,7},长度为3。
一、简单的O(n^2)的算法
很容易想到用动态规划做。设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i>j。然后在lis[]中找到最大的一个值,时间复杂度是O(n^2)。
代码实现:
int Longest_Increasing(int num[],int n){
int lis[n],i,j;
for(i=0;i<n;i++){
lis[i]=1;
for(j=0;j<i;j++)
if(num[i]>num[j]&&lis[j]+1>lis[i])
lis[i]=lis[j]+1;
}
int maxn=0;
for(i=0;i<n;i++) if(maxn<lis[i]) maxn=lis[i];
return maxn;
}
二、复杂点的O(nlogn)算法
概述:O(nlogn)的算法关键是它建立了一个数组b[],b[i]表示长度为i的不下降序列中结尾元素的最小值,用K表示数组目前的长度,算法完成后K的值即为最长不下降子序列的长度。
具体点来讲:
设当前的以求出的长度为K,则判断a[i]和b[k]:
1.如果a[i]>=b[k],即a[i]大于长度为K的序列中的最后一个元素,这样就可以使序列的长度增加1,即K=K+1,然后现在的b[k]=a[i];
2.如果a[i]<b[k],那么就在b[1]...b[k]中找到最大的j,使得b[j]<a[i],然后因为b[j]<a[i],所以a[i]大于长度为j的序列的最后一个元素,那么就可以更新长度为j+1的序列的最后一个元素,即b[j+1]=a[i]。
算法复杂度的分析:
因为共有n个元素要进行计算;每次计算又要查找n次,所以复杂度是O(n^2),但是,注意到b[]数组里的元素的单调递增的,所以我们可以用二分法,查找变成了logn次。这样算法的复杂度就变成了O(nlogn)。具体算法实现请看代码(7-13update:以前的blog用不了了,所以重新弄过了)。
下面这段代码解决的是一道OI的题。
http://www.rqnoj.cn/Problem_Show.asp?PID=167
#include<iostream>
using namespace std;
long f[100001]={0},l=1,r,m,t=0,a;
inline void BinarySearch(){
while(l<=r){
m=(l+r)>>1;
if(f[m]==a){l=m;return;}
else
if(f[m]>a)l=m+1;
else r=m-1;
}
}
main(){
long n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
if(a==0)continue;
l=1,r=t;
BinarySearch();
if(l<=t)f[l]=a;
else t++,f[t]=a;
}
cout<<t;
}
//若仍然不能深刻理解可参考http://blog.sina.com.cn/s/reader_4ec7d3fc01000aet.html或跟我讨论
最长不下降子序列的O(n^2)算法和O(nlogn)算法相关推荐
- 最长不下降子序列(推广问题)
最长不下降子序列问题的定义:在一个序列中,找到一个最长的子序列,其中这个序列是非递减的 我们可以把这个非递减推广,其实非递减就是一种顺序,那么我们可以把定义推广到:给出一个顺序序列.目标序列中,在目标 ...
- 最大流 ---- 最大不相交路径数 ---- P2766 最长不下降子序列问题(网络流24题)
题目链接 最多不相交路径 这种问题变化比较多,但都能表示成以下形式: 已知一些路径,每个节点只能属于一条路径,求能选择多少条路径使它们不相交. 主要的方法是拆点,将一个点拆成两个,然后连边,容量表示该 ...
- 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列
唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...
- 【P2766】 最长不下降子序列问题
题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...
- 洛谷2766:[网络流24题]最长不下降子序列问题——题解
https://www.luogu.org/problemnew/show/P2766 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出 ...
- CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)
题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在有 m 个位置被锁定,也就是无法进行操作,每次操作可以选择一个没有被锁定的位置,将其更改为任意数值,现在问最少进行多少次操作,可以使得整个 ...
- 洛谷 - P2766 最长不下降子序列问题(最大流+动态规划+思维建边)
题目链接:点击查看 题目大意:给出一个由n个数组成的序列,有三个子问题: 求出当前数列的最长不下降子序列的长度len 如果每个数最多只能使用一次,问最多可以组成多少个长度为len的最长不下降子序列 如 ...
- 中石油训练赛 - Racing Gems(最长不下降子序列)
题目描述 You are playing a racing game. Your character starts at the X-axis line (y=0) and ...
- HDU - 1160 FatMouse's Speed(最长不下降子序列)
题目链接:点击查看 题目大意:给出许多二元组(W,S),最后要求输出最长的满足W严格递增,S严格递减的子序列长度,以及方案,输出任意一种即可 题目分析:看起来像二维偏序,其实对任意一维排序后求最长不下 ...
最新文章
- 服务器根目录文件配置文件,在文档根目录中存储安装和配置文件
- 开源大数据周刊-第49期
- NodeAsp——像开发NodeJS应用一样玩转ASP
- CPU profiling
- leetcode19. 删除链表的倒数第N个节点
- 华为首款可折叠屏5G手机今日开售;GitHub将开源代码保存在北极;Win10禁用WEP加密|极客头条...
- Xib和StoryBoard的区别
- 系统学习NLP(九)--中文分词算法综述
- Post传值时间特殊字符处理比如 p/p当作参数传递到后台
- SVN客户端的使用方法
- 手把手教你在树莓派上搭建ghost个人博客呦
- Chrome谷歌浏览器Flash Player被屏蔽如何解决
- 怎么比对两个html列表,两个表格对比,如何快速找出不同数据!
- ADF用户页面行为监控
- 如何读取蓝牙linkkeys值
- ffmpeg转换视频内存溢出的问题
- JDBC使用教程详解
- 一女孩写的(女人反省,男人感动。。。)
- 你怎样看待男女军人接吻
- 升级到 iOS 16 后掉电快?更新后手机发热怎么办?
热门文章
- 【Android 插件化】Hook 插件化框架 ( 通过反射获取 “插件包“ 中的 Element[] dexElements )
- docker进阶篇(一) ---- Volume(数据卷)
- JavaSript模块规范 - AMD规范与CMD规范介绍[转]
- 关于椭圆的积分变量替换
- Android JNI 传递对象
- Agent Job相关的系统表
- Apache地址重写的几个问题
- 汇编语言随笔(9)-实验11(用条件转移指令来编写子程序)
- Mac下使用ABTestingGateway快速搭建灰度网关
- 新书预告:《Linux 多线程服务端编程——使用 muduo C++ 网络库》