日记

日记

Sat Dec 07 2024
2 分钟

上午#

今天也是终于不用考试了。

CF2030E MEXimize the Score solution#

这题既然出现在了dp专题里,那就一定是dp咯
我们考虑每一个 mink=0icntk\min\limits_{k = 0}^{i}cnt_k 对答案的贡献是多少,也就是有多少个子序列满足 mink=0icntk=j\min\limits_{k = 0}^{i}cnt_k = j
我们设 dpi,jdp_{i,j} 表示只用了前 ii 个数(也就是 [0,i][0,i] ),mink=0icntk=j\min\limits_{k = 0}^{i}cnt_k = j 的子序列数量。转移如下:

  • 如果加入元素 ii 后,mink=0icntk\min\limits_{k = 0}^{i}cnt_k 才等于 jj ,则说明 mink=0i1>j\min\limits_{k = 0}^{i - 1} > j 。那么我们就把大于 jj 的方案数之和,和从 cnticnt_i 里取 jj 个的方案乘起来,有dp方程:dpi,j=(k=j+1cntidpi1,k)×(cntij)dp_{i,j} = \left(\sum\limits_{k = j + 1}^{cnt_i}dp_{i - 1,k} \right) \times \binom{cnt_i}{j}
  • 如果加入元素 ii 后,mink=0icntk\min\limits_{k = 0}^{i}cnt_k 不变,还是 jj ,那么 cntijcnt_i \ge j 。我们就把 ii 的个数大于 jj 的组合数之和,和从前 i1i - 1 个数里的方案数乘起来,有dp方程:dpi,j=(k=jcnti(cntik))×dpi1,jdp_{i,j} = \left(\sum\limits_{k = j}^{cnt_i}\binom{cnt_i}{k}\right) \times dp_{i - 1,j}

初始化的时候,dp0,j=(cnt0j)dp_{0,j} = \binom{cnt_0}{j}
然后如何统计答案呢?对于每一个 dpi,jdp_{i,j} ,我们只考虑了前 ii 个数,但是,后面的 [i+1,n)[i + 1,n) 我们没考虑。所以实际上,满足 mink=0icntk=j\min\limits_{k = 0}^{i}cnt_k = j 的子序列有 dpi,j×2k=i+1n1cntkdp_{i,j} \times 2^{\sum\limits_{k = i + 1}^{n - 1}cnt_k} 个。而答案又是 jj 乘子序列数量,那么总答案就是 dpi,j×2k=i+1n1cntk×jdp_{i,j} \times 2^{\sum\limits_{k = i + 1}^{n - 1}cnt_k} \times j

剩下的不写了,明天的日记里再写。