题目链接: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 |
|
输出 #1
1 |
|
输入输出样例 #2
输入 #2
1 |
|
输出 #2
1 |
|
说明/提示
在第一个例子中,解为 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))$。