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