2023.9.19

P3446 [POI2006] EST-Aesthetic Text

首先考虑最简单的DP,设 \(f_{i,j}\) 表示当前的最后一行是由 \((i-j+1,i)\) 的单词组成的,设

\[len_{i,j}=(j-1)+\sum_{k=i-j+1}^{i}l_k \]

表示 \((i-j+1,i)\) 的单词组成一行的长度,则有DP

\[f_{i,j}=\min_{k=1}^{i-j}\{f_{i-j,k}+|len_{i,j}-len_{i-j,k}|\} \]

该DP的复杂度为 \(O(n^3)\) ,无法通过,于是考虑使用去绝对值的技巧

\[pre_{i,j}=f_{i,j}-len_{i,j} \]

\[suf_{i,j}=f_{i,j}+len_{i,j} \]

对于每次转移,因为 \(len_{i,j}\) 关于 \(j\) 单调递增,所以只需要找出使 \(len_{i-j,k}\leq len_{i,j}\) 的最大的 \(k\) ,此时 \(k\) 之前的全部小于等于 \(len_{i,j}\)\(k\) 之后的全部大于 \(len_{i,j}\) ,于是转移就变成了 \(pre_{i-j,k}\) 的前缀 \(\min\) 加上 \(len_{i,j}\) , \(suf_{i-j,k+1}\) 的后缀 \(\min\) 减去 \(len_{i,j}\)

因为对于相同的 \(i-j\)\(len_{i,j}\) 关于 \(i\) 单调递增,所以对于每个 \(i-j\) 维护一个指针即可,这样使复杂度降到 \(O(n^2)\) 可以通过本题

P6561 [SBCOI2020] 人

将所有的数分为 \(2i+1\)\(2i+2\) ,对于每个 \(i\) 有三种情况

  • \(2i+1\) 被选
  • \(2i+2\) 被选
  • 两个数都没被选

将这三种情况依次记为 \(A\)\(B\)\(C\) 那么我们就是要求一个含 \(a\)\(A\)\(b\)\(B\)\(m-a-b\)\(C\) 的序列的个数,并且 \(A\) 不能排在 \(B\) 之后

先不考虑 \(A\) ,将 \(b\)\(B\) 插入 \(C\) 之中,方案数为

\[C_{m-a}^{b} \]

然后考虑插入 \(A\) ,第一个 \(A\) 可以放在最前面买也可以放在任意一个 \(C\) 后面,有 \((m-a-b+1)\) 种可能,第二个 \(A\) 可以放在最前面,也可以放在任意一个 \(C\) 或前面的 \(A\) 之后,有 \((m-a-b+2)\) 种可能,以此类推,又因为每个 \(A\) 没有区别,所以总方案数为

\[\frac{(m-a-b+1)(m-a-b+2)...(m-b)}{a!}\\ =\frac{(m-b)!}{a!(m-b-a)!}\\ =C_{m-b}^{a} \]

最终方案数为

\[C_{m-a}^{b}\times C_{m-b}^{a} \]

预处理阶乘和逆元即可

posted @ 2023-09-20 15:26  imyhy  阅读(29)  评论(0)    收藏  举报