今天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。