(LIS)最长上升序列(DP+二分优化)
2024-09-01 16:43:28
求一个数列的最长上升序列
动态规划法:O(n^2)
//DP
int LIS(int a[], int n)
{
int DP[n];
int Cnt=-;
memset(DP, , sizeof(DP));
for(int i=; i<n; i++ )
{
for(int j=; j<i; j++ )
{
if( a[i]>a[j] )
{
DP[i] = max(DP[i], DP[j]+);
Cnt = max(DP[i], Cnt);//记录最长序列所含元素的个数
}
}
}
return Cnt+;//因为初始化为0,所以返回结果+1
}
贪心+二分法:O(nlogn)
分析:要让一个序列具有最长上升子序列,其实就是保证子序列中的每个元素尽可能小,降低门槛,让后面的元素尽可能多进入该子序列
实现:定义一个最长子序列数组Array,以及当前长度Len,从头到尾维护数组a
a. a[i]>Array[i] (当前元素大于子序列结尾元素),则a[i]进入子序列:Array[++len] = a[i]
b. a[i]<=Array[i],这时对Array进行维护,把Array中比a[i]大的第一个元素替换成a[i](这样可以降低后面元素进入子序列的门槛。
c. 为了降低算法复杂度,因为Array是升序序列,所以用lower_bound查找Array中第一个大于等于a[i]的元素
//贪心+二分
int LIS(int a[])
{
int Cnt=;
int Array[n+];
Array[] = a[];
for(int i=; i<n; i++ )
{
if( a[i]>Array[Cnt] )
Array[++Cnt]=a[i];
else
{
int Index=lower_bound(Array, Array+Cnt+, a[i])-Array;
Array[Index]=a[i];
}
}
return Cnt+;
}
求最长下降子序列:
不需要再写LDS---直接将要求的数组倒序,倒序数组的最长上升子序列长度=原数组最长下降子序列长度。
最新文章
- MySQL 同主机不同数据库之间的复制
- Learning with Trees
- ASP.NET Web API身份验证和授权
- 【CodeForces 618B】Guess the Permutation
- Js日期选择器并自动加入到输入框中
- cluster,network
- 前端js插件
- Windows下Lua+Redis 断点调试环境搭建==Linux下类似
- GCD code block
- (二)Javascript面向对象编程:构造函数的继承
- 组队项目,Main队伍
- 【docker】资料
- 性能测试二十二:环境部署之Nginx
- 重拾 BFC、IFC、GFC、FFC
- js静态数据分页展示
- Software Defined Networking(Week 2, part 3)
- weevely入手使用笔记
- ES6 Promise 让异步函数顺序执行
- mysql-5.7.17的最新安装教程
- 2017-5-14 湘潭市赛 Strange Optimization