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})$。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现