最长上升子序列(LIS.pas/c/cpp)
LIS问题是最经典的动态规划基础问题之一。如果要求一个满足一定条件的最长上升子序列,你还能解决吗?
给出一个长度为N整数序列,请求出它的包含第K个元素的最长上升子序列。
例如:对于长度为6的序列<2,7,3,4,8,5>,它的最长上升子序列为<2,3,4,5>,但如果限制一定要包含第2个元素,那么满足此要求的最长上升子序列就只能是<2,7,8>了。
输入数据
第一行为两个整数N,K,如上所述。
接下来是N个整数,描述一个序列。
输出数据
请输出两个整数,即包含第K个元素的最长上升子序列长度。
样例输入与输出
|
8 6 65 158 170 299 300 155 207 389 |
4 |
数据范围
对于所有的数据,满足0<n<=200000,0<k<=n
可以把原序列分成两组 {a1...ak}{ak+1...an}先把第一组中大于ak的都删掉,把第二组中小于ak都删去,对第一组做一次lis(包含ak)在对第二组做一次lis,两次长度和即是答案,对于200000的数据,要用到nlogn级别的lis
c:
pascal:没用nlgn的lis,过8个点
这是一篇关于最长上升子序列变形问题的题解,介绍了如何在原序列中找到包含特定元素的最长上升子序列。文章通过C++和Pascal两种语言提供了实现算法,并讨论了如何在200000数据规模下使用nlogn级别的算法来求解。
897

被折叠的 条评论
为什么被折叠?



