计数dp做题笔记

YCJS 3924 饼干

Description

给定一个长度为\(n\)的序列,序列每个元素的取值为\([1,x]\),现在给定\(q\)个区间,求在所有取值方案中,区间最小值的最大值的期望是多少?(答案对1e9+7取模)

\(n,q,x\le 2000\)

Solution

  • 首先对于这种区间问题,要找到一种转移顺序的话,就要使得这个序列有序(可以是左右端点递增)。

  • 然后对于这道题目,考虑枚举最小值的最大值\(ans\)

  • 性质1:如果区间a包含区间b,那么\(ans\)只可能存在于区间b中。

  • 所以可以通过该性质删去一些区间,然后转移就有序了。

  • 性质2:如果区间有序,那么所有有被区间包含的点\(a_i\),包含它们的区间的编号也是递增的。

  • 那么可以比较容易定义出一个\(O(n^3)\)的转移。

  • 首先枚举ans,然后每个区间就一定要存在至少一个点的权值\(\le ans\) 然后答案为ans的方案就是\(F[ans]-F[ans-1]\)

  • 定义\(dp_{i,j}\) 为枚举到第i个点,满足到第j个区间的方案数,发现转移是\(O(1)\)的,因为只用知道当前点要填的数是否>ans就可以计算出转移到的状态。

  • 然后化简状态,令\(dp_i\) 表示第i个点的权值\(<=ans\),且填到第i个点仍是合法的方案数。

  • 定义 \(L_i\)表示覆盖第i个点的区间的最小编号,\(R_i\)表示覆盖第i个点的最大编号

  • 那么转移方程为\[dp_i=ans*\sum\limits _{R_j\ge L_i-1} dp_j*(x-ans)^{i-j-1}\]

  • 进一步化简\[dp_i=ans*(x-ans)^i*\sum \limits_{R_j\ge L_i-1} dp_j*(x-ans)^{-j-1}\]

  • 由性质2可得,满足条件的j是一端连续的区间,所以可以用前缀和维护后面一端累和,然后转移就是\(O(1)\)的了。

  • 总复杂度\(O(n^2)\)

猜你喜欢

转载自www.cnblogs.com/Zerokei/p/9689668.html