About LIS(Longest Increasing Subsequence)

今天528给讲了基础的DP,其中第一道例题就是最长不下降子序列——LIS。

题目简述:给出N个数,求最长不下降子序列的长度。

数据范围:30% N<=1000 ; 100% N<=100000.

首先30%的数据很容易,可以想到一个N2的算法:

用f[i]表示以i结尾的最长不下降子序列的长度最长为多少,推出动态转移方程:f[i]=max(f[j])+1(a[i]>=a[j]&&j<i)

BUT!看看数据就知道,只能拿30分,这个O(n2)的效率显然只能拿部分分。怎么办呢,祭出O(n log n)算法!铛铛!

用f[n]表示最长不下降子序列长度为n的序列末尾最小值为多少,然后我们转移的时候就可以二分,二分最长不下降子序列的长度,然后与f[mid]比较,得出答案。用答案更新f数组。

可以做做 http://www.rqnoj.cn/problem/167 这题,是个纯裸的LIS。

上一篇:bzoj 3202 [Sdoi 2013] 项链 —— 置换+计数


下一篇:C#引用COM对象,报错:《类型 *** 未定义构造函数, 无法嵌入互操作类型 *** 。请改用适用的接口》的解决办法。