最长上升子序列(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个点