博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长递增子序列LIS再谈
阅读量:6848 次
发布时间:2019-06-26

本文共 1115 字,大约阅读时间需要 3 分钟。

DP模型:

d(i) 以第 i 个元素结尾的最长递增子序列的长度。

那么就有 d(i) = max(d(j)) + 1;(j<i&&a[j]<a[i]),答案 max(d(i)); 时间复杂度为 O(n*n);

 

下面介绍一个用二分优化的O(nlogn)的算法。

用一个数组g[i] 表示 d 值为 i 的数的最小的 a;即 最长递增子序列为 i 时,最小的 a 是多少。

显然 g[i]<=g[2]<=g[3];

计算d[i] : 需要找到 g中大于等于a[i] 的第一个数 j ,d[i] = j;

更新g :     g[j] = a[i] ;

使用STL的lower_bound可以直接求出比a[i] 大的第一个数,用的二分查找实现,总时间O(nlogn);

 

#include 
using namespace std;int a[1005];int b[1005];int main(){ int n; scanf("%d",&n); for(int i=0;i
b[len-1]) b[len++] = a[i]; else { int pos = lower_bound(b,b+len,a[i])-b; b[pos] = a[i]; } } printf("%d\n",len); return 0;}
View Code
#include 
#include
#include
using namespace std;#define maxn 1005#define INF 0x3f3f3f3fint a[1005];int g[1005];int binary_search(int *s,int digit,int length) { int left = 0,right = length,mid; while(right!=left) { mid = (left+right)/2; if(digit==s[mid]) return mid; else if(digit
View Code

转载于:https://www.cnblogs.com/TreeDream/p/5988041.html

你可能感兴趣的文章
python property方法的使用
查看>>
String Extension (2):Template Engine
查看>>
去掉eclipse的 xml验证,有时候不去掉的话,第一次导入项目就太久了
查看>>
java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction
查看>>
android安全问题(六) 抢先接收广播 - 内因篇之广播接收器注册流程
查看>>
用于图片等小文件大规模存储的分布式文件系统调研
查看>>
数据恢复陶工西部数据5毫米硬盘特殊接口,OEM私人订制,最薄的混合硬盘!
查看>>
linux 下面提示:Ignoring unknown interface eth0=eth0的解决方案
查看>>
Ubuntu Linux下最好用的五大BT工具介绍
查看>>
DLNA&UPnP开发笔记(1)
查看>>
AutoLayout下CollectionView的自适应大小(一)
查看>>
我的友情链接
查看>>
写给MongoDB开发者的50条建议Tip24
查看>>
Java:快速排序(双指针版)
查看>>
二叉树基础
查看>>
Device eth0 does not seem to be present, delaying initialization
查看>>
我的友情链接
查看>>
excel中强制换行
查看>>
一个KVM的安装
查看>>
我的友情链接
查看>>