Description

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

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

输出仅一行,即压缩后字符串的最短长度。
Sample Input
bcdcdcdcdxcdcdcdcd
Sample Output
12

HINT

在第一个例子中,解为aaaRa,在第二个例子中,解为bMcdRRxMcdRR。 【限制】 50%的数据满足:1<=n<=20 100%的数据满足:1<=n<=50 100%的数据满足:1<=n<=50

区间dp

f[l,r,k]表示区间[l,r]中间是否有M时的最短长度(一个是可能有,一个是一定没有,前面默认有一个M,合并的时候要记得补上)

 var
flag:array[..,..,..,..]of boolean;
f:array[..,..,..]of longint;
n:longint;
s:string; procedure init;
var
i,j,k:longint;
begin
readln(s);
for i:= to length(s)- do
for j:=i+ to length(s) do
if s[i]=s[j] then flag[i,i,j,j]:=true;
for i:= to length(s)- do
for j:=i+ to length(s) do
for k:= to length(s)-j do
if flag[i,i+k-,j,j+k-] and (s[i+k]=s[j+k]) then flag[i,i+k,j,j+k]:=true;
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; procedure dp;
var
i,j,k:longint;
begin
fillchar(f,sizeof(f),);
n:=length(s);
for i:= to n do
begin
f[i,i,]:=;
f[i,i,]:=;
end;
for k:= to n- do
for i:= to n-k do
begin
if k and = then
if flag[i,i+k>>,i+k>>+,i+k] then
begin
f[i,i+k,]:=f[i,i+k>>,]+;
f[i,i+k,]:=f[i,i+k,];
end;
for j:=i to i+k- do
begin
f[i,i+k,]:=min(f[i,i+k,],f[i,j,]+i+k-j);
f[i,i+k,]:=min(f[i,i+k,],f[i,j,]+f[j+,i+k,]+);
end;
f[i,i+k,]:=min(f[i,i+k,],f[i,i+k,]);
end;
writeln(f[,n,]);
end; begin
init;
dp;
end.

1068: [SCOI2007]压缩 - BZOJ的更多相关文章

  1. bzoj 1068: [SCOI2007]压缩 DP

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 496  Solved: 315[Submit][Status] D ...

  2. bzoj 1068 [SCOI2007]压缩 区间dp

    [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1644  Solved: 1042[Submit][Status][Discu ...

  3. [BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】

    题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + S ...

  4. BZOJ 1068: [SCOI2007]压缩

    Sol 区间DP.这个区间DP需要三维, \(f[i][j][k]\) 表示\([i,j]\) 这个区间中是否存在 \(M\) . 转移有两种,一种是这个区间存在 \(M\) ,那么直接枚举 \(M\ ...

  5. 【BZOJ】1068: [SCOI2007]压缩(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...

  6. bzoj 1068: [SCOI2007]压缩【区间dp】

    神区间dp 设f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内只有这一个M,f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内有两个及以上的M 然后显然的转移是f[i][ ...

  7. 1068: [SCOI2007]压缩

    题解: 区间DP 考虑状态的设计: \(dp[i][j][0/1]\)表示原字符串的\(i-j\)区间有无在中间加\(M\).并且默认在\(i\)之前加入\(M\)压缩后的最小长度,显然有转移: \[ ...

  8. 1068. [SCOI2007]压缩【区间DP】

    Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上 ...

  9. BZOJ1068: [SCOI2007]压缩

    ... 1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 909  Solved: 566[Submit][Statu ...

随机推荐

  1. blogs

    http://blogs.msdn.com/b/tess/archive/2008/02/04/net-debugging-demos-information-and-setup-instructio ...

  2. js 动态添加元素(div、li、img等)及设置属性

    把一串 html 标签赋给一个 javascript 变量,除属性的值要用转义的双引号外,某些时候字符串还很长,显得有些复杂.如果用 js 动态添加元素,就不会有那么复杂的字符串出现,代码阅读性强一点 ...

  3. javascript笔记——label包含的自定义按钮选中

    自定义按钮ui样式就是需要有label包含input以及带另外的标签作为新ui的载体,此时触发label的click的时候也会选中按钮,也就是说存在事件捕获,解决这个问题有如下方式 用到了 mouse ...

  4. Java中浮点数能连续精确表示整数的范围

    转自http://blog.csdn.net/seizef/article/details/5571783#ref_1,有删改. 先简单介绍一下浮点数在计算机中的组成,在Java中采用的浮点数表示法是 ...

  5. 杭电ACM2092--整数解

    杭电ACM2092--整数解    分析 http://acm.hdu.edu.cn/showproblem.php?pid=2092 一个YES,一个Yes.试了10几次..我也是无语了..哪里都不 ...

  6. linux install mpi4py

    Downloading The MPI for Python package is available for download at the project website generously h ...

  7. 【风马一族_Java】 Java的文件类 java.io

    BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取. 可以指定缓冲区的大小,或者可使用默认的大小.大多数情况下,默认值就足够大了. 通常,Reader ...

  8. PCB常用度量衡单位

    1英尺=12英寸 1英寸inch=1000密尔mil 1mil=25.4um 1mil=1000uin (mil密耳有时也成英丝) 1um=40uin(有些公司称微英寸为麦,其实是微英寸) 1OZ=2 ...

  9. Amazon Kinesis Producer Library 使用记录

    Amazon Kinesis 是一种托管的服务,用于有弹性与扩展性的实时处理大规模的流数据.该服务收集大数据记录流,多个可在 Amazon EC2 实例上运行的数据处理应用程序随后可实时使用此流. 在 ...

  10. [精校版]The Swift Programming Language

    通常来说,编程语言教程中的第一个程序应该在屏幕上打印“Hello, world”.在 Swift 中,可以用一行代码实现:  println("hello, world")   如 ...