利用C++优势快速打完最长不下降子序列

来源:互联网 发布:linux临时设置环境变量 编辑:程序博客网 时间:2024/04/26 23:17

n log n求最长不下降子序列

我们设d[i]表示长度为i的最长不下降子序列最尾元素的最小值,显然d[i]<=d[i+1],d数组符合单调性。因此对于a[i]只需在d数组中二分即可。

lower_bound与upper_bound

lower_bound(a+l,a+r+1,key)表示在a数组的l~r范围进行二份查找(注意你需要保证这个数组的单调性,可以加cmp来表达他的单调性,默认单调性是非递减),找到第一个>=key的位置并返回。
而upper_bound则是找到第一个>key的位置返回。
求最长不下降子序列可以利用C++STL中algorithm库里的这两个东西来减少代码量。附代码

fo(i,1,n){        k=upper_bound(d+1,d+n+1,a[i])-d;        ans=max(ans,k);        d[k]=min(d[k],a[i]);    }

如果要求最长上升子序列改成lower_bound即可。

0 0
原创粉丝点击