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 @   changwenxuan  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示