博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[zz]LIS
阅读量:6974 次
发布时间:2019-06-27

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

引出:

问题描述:给出一个序列a1,a2,a3,a4,a5,a6,a7….an,求它的一个子序列(设为s1,s2,…sn),使得这个子序列满足这样的性质,s1<s2<s3<…<sn并且这个子序列的长度最长。输出这个最长的长度。(为了简化该类问题,我们将诸如最长下降子序列及最长不上升子序列等问题都看成同一个问题,其实仔细思考就会发现,这其实只是<符号定义上的问题,并不影响问题的实质)

例如有一个序列:1  7  3  5  9  4  8,它的最长上升子序列就是 1 3 4 8 长度为4.

分析:

这题目是经典的DP题目,也可叫作 或者 最长不下降子序列。很基础的题目,有两种算法,复杂度分别为O(n*logn)和O(n^2) 。

算法1:

时间复杂度:O(n^2):
我们依次遍历整个序列,每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列。我们用dp[i]来存放序列1-i的最长上升子序列的长度,那么dp[i]=max(dp[j])+1,(j∈[1, i-1]); 显然dp[1]=1,我们从i=2开始遍历后面的元素即可。

// Author: Tanky Woo// Blog: www.WuTianQi.comint dp[1000];int LIS(int arr[1000], int n){	for(int i=1; i<=n; ++i)		dp[i] = 0;	int ans;	dp[1] = 1;	for(int i=2; i<=n; ++i)	{		ans = dp[i];		for(int j=1; j
arr[j] && dp[j]>ans) ans = dp[j]; } dp[i] = ans+1; } ans = 0; for(int i=1; i<=n; ++i) { if(dp[i] > ans) ans = dp[i]; } return ans;}

算法2:

时间复杂度:(NlogN):
除了算法一的定义之外,增加一个数组b,b[i]用以表示长度为i最长子序列的最后一个数最小可以是多少。易证:i<j时,b[i]<b[j]。
在二分查找时,一直更新b[]内容,设此时b的总长度为k,
若1. arr[i] >= b[k], 则b[k+1] = arr[i];
若2. arr[i] <  b[k], 则在b[1..k]中用二分搜索大于arr[i]的最小值,返回其位置pos,然后更新b[pos]=arr[i]。

// Author: Tanky Woo// Blog: www.WuTianQi.com// num为要查找的数,k是范围上限// 二分查找大于num的最小值,并返回其位置int bSearch(int num, int k)  {      int low=1, high=k;      while(low<=high)      {          int mid=(low+high)/2;          if(num>=b[mid])              low=mid+1;          else               high=mid-1;      }      return low;  }   int LIS(){	int low = 1, high = n;	int k = 1;	b[1] = p[1];	for(int i=2; i<=n; ++i)	{		if(p[i]>=b[k])			b[++k] = p[i];		else		{			int pos = bSearch(p[i], k);			b[pos] = p[i];		}	}	return k;}

以下是证明b[]的单调递增性:

b序列是严格递增的,即b[1] < b[2] < … < b[t]。
证明:
若b[i] >= b[i + 1],b[i + 1] 是长度为i+1的递增子序列的尾项的最小值,设此序列为x[1]..x[i+1],x[1]..x[i]即构成长度为i的递增子序列,x[i] < x[i+1] = b[i+1] <= b[i],与b[i]定义不符。

 

 

转载于:https://www.cnblogs.com/eric-blog/archive/2012/05/03/2480696.html

你可能感兴趣的文章
apache2 开源协议
查看>>
JFinal
查看>>
图片跟随鼠标移动
查看>>
使用Java绘制验证码
查看>>
前端知识点总结(html+css)部分
查看>>
docker安装elasticsearch
查看>>
设计模式
查看>>
ACM 擅长排列的小明
查看>>
VI/VIM 编辑器
查看>>
PHPGrid 1.4.8 发布,PHP 的 CRUD 框架
查看>>
Python面向对象关系
查看>>
OpenCV学习(2)--基本数据结构
查看>>
C#写爬虫,版本V2.0
查看>>
03 弹性盒模型
查看>>
a前缀
查看>>
LeetCode第七天
查看>>
ORACLE存储过程 练习系列三 失效或者生效指定表的外键
查看>>
Android环境搭建(Windows)
查看>>
django 项目创建使用
查看>>
接口数据加密
查看>>