EagleBear2002 的博客

这里必须根绝一切犹豫,这里任何怯懦都无济于事

P2470 [SCOI2007] 压缩

题目链接:P2470 [SCOI2007] 压缩 - 洛谷

题目描述

给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息。压缩后的字符串除了小写字母外还可以(但不必)包含大写字母 R 与 M,其中 M 标记重复串的开始,R 重复从上一个 M(如果当前位置左边没有 M,则从串的开始算起)开始的解压结果(称为缓冲串)。

bcdcdcdcd 可以压缩为 bMcdRR,下面是解压缩的过程:

已经解压的部分 解压结果 缓冲串
b b b
bM b .
bMc bc c
bMcd bcd cd
bMcdR bcdcd cdcd
bMcdRR bcdcdcdcd cdcdcdcd

输入格式

输入仅一行,包含待压缩字符串,仅包含小写字母,长度为 n。

输出格式

输出仅一行,即压缩后字符串的最短长度。

输入输出样例 #1

输入 #1

1
aaaaaaa

输出 #1

1
5

输入输出样例 #2

输入 #2

1
bcdcdcdcdxcdcdcdcd

输出 #2

1
12

说明/提示

在第一个例子中,解为 aaaRa,在第二个例子中,解为 bMcdRRxMcdRR

【限制】

50%的数据满足:$1 \le n \le 20$

100%的数据满足:$1 \le n \le 50$

题解

定义 $f(l,r,0/1)$ 表示子串 $s_{l \sim r}$ 在不使用/使用 M 操作的压缩后最小长度。

若子串 $s_{l \sim r}$ 可被折叠,则 $f(l,r,0) = f(l,mid,0) + 1$;

$$ f(l,r,0) = \min_{l \le k < r}\set{f(l,k,0)+1} \ f(l,r,1) = \min_{l \le k < r}\set{\min(f(l,k,0), f(l,k,1)) + 1 + \min(f(k + 1,r,1), f(k + 1,r,0))} \ $$

最后答案即为 $\min(f(1,n,0),f(1,n,1))$。