链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=820&pid=1005
这题随机给你一个1~n的排列,要你统计这1~n的排列中长度为1~n的上升子序列的个数分别是多少。
由于数据是随机的,因此这个序列中的LIS满足下面这个工作:
LIS的长度大概是2√N,当N=10000时,LIS的最长长度大约为200。
我们很容易就推出LIS的计数公式:
f(i,k)+=(pi>pj)?f(j,k−1):0
可以考虑枚举LIS的长度l,用bit维护到第i个位置的数字p[i]、长度为l−1的上升子序列的总数,这样每次扫一个位置的时候,就可以直接查前缀和了。
由于要更新bit,所以维护一个滚动的dp数组,在查询长度为l−1的计数结果的同时,更新答案以及l的计数。
1 |
|
v1.5.2