求一个数列的最长上升序列

  动态规划法: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---直接将要求的数组倒序,倒序数组的最长上升子序列长度=原数组最长下降子序列长度。

最新文章

  1. MySQL 同主机不同数据库之间的复制
  2. Learning with Trees
  3. ASP.NET Web API身份验证和授权
  4. 【CodeForces 618B】Guess the Permutation
  5. Js日期选择器并自动加入到输入框中
  6. cluster,network
  7. 前端js插件
  8. Windows下Lua+Redis 断点调试环境搭建==Linux下类似
  9. GCD code block
  10. (二)Javascript面向对象编程:构造函数的继承
  11. 组队项目,Main队伍
  12. 【docker】资料
  13. 性能测试二十二:环境部署之Nginx
  14. 重拾 BFC、IFC、GFC、FFC
  15. js静态数据分页展示
  16. Software Defined Networking(Week 2, part 3)
  17. weevely入手使用笔记
  18. ES6 Promise 让异步函数顺序执行
  19. mysql-5.7.17的最新安装教程
  20. 2017-5-14 湘潭市赛 Strange Optimization

热门文章

  1. spring Boot 学习(一、Spring Boot与缓存)
  2. FORM表单 onclick()与onsubmit()
  3. spring中AspectJ的使用
  4. java中异常的抛出:throw throws
  5. js数组【续】(相关方法)
  6. vue-quill-edito 字体倾斜加粗无效
  7. Firebird 事务隔离级别
  8. 支付宝支付 微信支付SDK接口不统一? 盘他!
  9. IDEA下创建Spring项目
  10. Windows下MongoDB的下载安装、环境配置