11月18日小练习 压缩

原文,本文系同步发表。

题目链接 P3787 压缩

对于子串 $[i,j]$,设 $dp1_{i,j}$ 为子串 $[i,j]$ 处理后存在 M 的情况,$dp2_{i,j}$ 为子串 $[i,j]$ 处理后不存在 M 的情况。

显然,当枚举一个子串 $[l,r]$ 时,如果能直接合成,那么就贪心地直接合成 $dp2_{i,j}=dp2_{i,\lfloor\frac{(i+j)}{2}\rfloor}$。

由于 $dp2_{i,j}$ 中没有 M,所以 $dp2_{i,j}$ 最多有一个以 $i$ 为开头的压缩串,所以在不能直接合成的情况下,做区间 dp:

$$dp2_{i,j}=\min_{k=i}^{k<j} dp2_{i,k}+(j-k)$$

也就是找以 $i$ 为开头的(或许压缩过)子串再拼接上原串的长度的最小值。

然后 $dp1$ 呢?显然,对于每次转移,只要枚举把 M 放在哪里就好了,所以有:

$$dp1_{i,j}=\min_{k-i}^{k<j} \min (dp1_{i,k},dp2_{i,k})+1+\min (dp1_{k+1,j},dp2_{k+1,j})$$

由于有两种情况,最终的答案就是 $\min(dp1_{1,n},dp2_{1,n})$。

posted @ 2023-11-19 09:44  changwenxuan  阅读(13)  评论(0)    收藏  举报  来源