最长上升子序列LIS
来源:互联网 发布:美工运营对骂gif 编辑:程序博客网 时间:2024/05/29 12:49
定义
最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。
求解方法
求LIS一般有两种方法
O(n2) 算法
则有如下递推式:
f[i]=max(f[j]+1)(a[j]<a[i]) 。因为每个数都要从头扫一遍,因此时间复杂度为
O(n2) 。伪代码(
a[i] 存的是值):
ans=0; memset(f,0,sizeof(f)); f[1]=1;for (int i=1;i<=n;i++){ for (int j=1;j<i;j++) if (a[i]>a[j])//一定要满足这个条件 ans=max(ans,f[i]=max(f[i],f[j]+1)); ans=max(ans,f[i]=max(f[i],1));}printf("%d\n",ans);return 0;
O(nlog2n) 算法
g[i] 表示LIS长度为i 时a[i] 的最小值。因为相同LIS的情况下,值越小更新的可能性越大。因此要存最小值。
对于枚举到的数
a[i] ,如果当前值比g[t] 还大(t 为目前已知LIS),那么直接放入g[++t] 中,否则二分查找更新的位置。时间复杂度O(nlog2n) 。伪代码:
int srch(int v,int l,int r){//二分查找 while (l<=r){ int mid=(l+r)/2; if (v>g[mid]) l=mid+1; else r=mid-1; } return l;}······g[1]=a[1]; t=1;for (int i=2;i<=n;i++) if (a[i]>g[t]) g[++t]=a[i]; else g[srch(a[i],1,t,true)]=a[i];printf("%d\n",t)
阅读全文
1 0
- 最长上升子序列LIS
- 最长上升子序列LIS
- 最长上升子序列(LIS)
- 最长上升子序列 LIS
- 最长上升子序列(LIS)
- LIS最长上升子序列
- 最长上升子序列 LIS
- 最长上升子序列LIS
- LIS最长上升子序列
- 最长上升子序列LIS
- LIS 最长上升子序列
- 最长上升子序列LIS
- LIS(最长上升子序列)
- LIS 最长上升子序列
- lis 最长上升子序列
- LIS-最长上升子序列
- 最长上升子序列(LIS)
- 最长上升子序列LIS
- Fliptile(USACO 2007 Nov)
- Windows环境下使用Nexus 3.X 搭建Maven私服及使用介绍
- 利用 Python 进行数据分析之IPython (一)
- 通过存储控制器访问外设
- MYSQL存储引擎特性及选择
- 最长上升子序列LIS
- 【C#】用EmguCV 绘制各种轮廓线
- hdu 2807 The Shortest Path(矩阵计算+Floyd)
- 使用tensorflow:LSTM神经网络预测股票(二)
- ASP.NET Web.config
- 【设计模式系列】之设计模式概述
- 【设计模式系列】之单利模式
- ActivityLifecycleCallbacks 实现app中所有Activity实例查找
- Javascript之变量作用域