动态规划求最长降序序列

这篇博客介绍了如何使用STL中的lower_bound和upper_bound函数来处理有序序列。通过这两个函数,可以在O(nlogn)的时间复杂度内找到序列中特定位置的元素。同时,文章提出了一种方法,通过将升序序列视为降序,利用lower_bound找到最长降序序列。这种方法适用于需要寻找有序序列中特定条件的元素或子序列的问题。
摘要由CSDN通过智能技术生成

这里可以用到两个stl库中的两个函数,lower_bound() 和 upper_bound().
lower_bound(a+1,a+n+1,x)是求一个序列中第一个大于等于x的数的位置。
upper_bound(a+1,a+n+1,x)是求一个序列中第一个大于x的数的位置。
这里的序列必须是有序序列,所谓有序系列,在STL库中默认有序序列为升序序列,而且一旦对降序序列做upper_bound(),就会发生错误。
那么如果我们想要得到一个有序序列中第一个小于或者小于等于x的数的位置,又该怎么办那?
我们可以把升序序列当做是降序序列,利用lower_bound(a+1,a+n+1,x,cmp)找到这个降序序列中第一个小于x的数的位置。
这里对于这个cmp函数,我们规定bool cmp(int a,int b){return a>b;}
当然C++中有关于大于的函数,可以代替我们上文中提到的cmp函数,lower_bound(a+1,a+n+1,x,greater<int>());

O(nlogn)的时间求最长降序序列

首先,我们需要一个数组s[],实质上充当栈的作用,从头往后遍历数组
a[],遇到小于栈顶元素的数入栈,否则,利用lower_bound(d,d+n,a[i])找到栈中第一个小于a[i]的数,并将这个数踢出栈,让a[i]代替这个数,其实就是一个赋值操作,这样找到的序列一定是最长的降序序列,升序序列与之亦同,自证不再赘述。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值