日记
今天也是终于不用考试了。
这题既然出现在了dp专题里,那就一定是dp咯
我们考虑每一个 k=0minicntk 对答案的贡献是多少,也就是有多少个子序列满足 k=0minicntk=j 。
我们设 dpi,j 表示只用了前 i 个数(也就是 [0,i] ),k=0minicntk=j 的子序列数量。转移如下:
- 如果加入元素 i 后,k=0minicntk 才等于 j ,则说明 k=0mini−1>j 。那么我们就把大于 j 的方案数之和,和从 cnti 里取 j 个的方案乘起来,有dp方程:dpi,j=(k=j+1∑cntidpi−1,k)×(jcnti) 。
- 如果加入元素 i 后,k=0minicntk 不变,还是 j ,那么 cnti≥j 。我们就把 i 的个数大于 j 的组合数之和,和从前 i−1 个数里的方案数乘起来,有dp方程:dpi,j=(k=j∑cnti(kcnti))×dpi−1,j 。
初始化的时候,dp0,j=(jcnt0) 。
然后如何统计答案呢?对于每一个 dpi,j ,我们只考虑了前 i 个数,但是,后面的 [i+1,n) 我们没考虑。所以实际上,满足 k=0minicntk=j 的子序列有 dpi,j×2k=i+1∑n−1cntk 个。而答案又是 j 乘子序列数量,那么总答案就是 dpi,j×2k=i+1∑n−1cntk×j
剩下的不写了,明天的日记里再写。