1068: [SCOI2007]压缩 - BZOJ
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的更多相关文章
- bzoj 1068: [SCOI2007]压缩 DP
1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 496 Solved: 315[Submit][Status] D ...
- bzoj 1068 [SCOI2007]压缩 区间dp
[SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1644 Solved: 1042[Submit][Status][Discu ...
- [BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】
题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + S ...
- BZOJ 1068: [SCOI2007]压缩
Sol 区间DP.这个区间DP需要三维, \(f[i][j][k]\) 表示\([i,j]\) 这个区间中是否存在 \(M\) . 转移有两种,一种是这个区间存在 \(M\) ,那么直接枚举 \(M\ ...
- 【BZOJ】1068: [SCOI2007]压缩(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...
- bzoj 1068: [SCOI2007]压缩【区间dp】
神区间dp 设f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内只有这一个M,f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内有两个及以上的M 然后显然的转移是f[i][ ...
- 1068: [SCOI2007]压缩
题解: 区间DP 考虑状态的设计: \(dp[i][j][0/1]\)表示原字符串的\(i-j\)区间有无在中间加\(M\).并且默认在\(i\)之前加入\(M\)压缩后的最小长度,显然有转移: \[ ...
- 1068. [SCOI2007]压缩【区间DP】
Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上 ...
- BZOJ1068: [SCOI2007]压缩
... 1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 909 Solved: 566[Submit][Statu ...
随机推荐
- HDU4272LianLianKan(dfs)
Problem Description I like playing game with my friend, although sometimes looks pretty naive. Today ...
- iOS 简单block的使用
1.第一种方法 声明block: - (void)test:(int) param_1 completion:(void(^)(int)) completion; 实现block: -(void)te ...
- oracle生成.net的guid方法;
最近在做一个T1的.NET项目,数据库oracle的时候,遇到一个问题..NET里面的某个数据库表类的某个字段是guid类型.但是用oracle生成的guid.跟.NET的guid 无法识别.导致报错 ...
- 对象this、currentTarget和target
在事件处理程序内部,对象this始终等于currentTarget的值,而target则只包含事件的实际目标.如果直接将事件处理程序指定给了目标元素,则this.currentTarget和targe ...
- 《UNIX编程艺术》读书笔记
最近这段时间比较忙,利用业余时间看完了这本书.虽然书中讲到的很多例子都是上古文物,我没有用过,不过原理都是相通的,对我的启发很大.比如无所不在的KISS原则,实践中慢慢体会到的SPOT原则,无不产生共 ...
- GVIM:在WINDOWS下清爽写代码
上大学后,你是不是也开始学习C语言了?特别是计算机学院的孩子,应当有更高的追求.C语言开课一段时间了,你是不是开始嫌弃IDE恶心的界面了?是不是跟我一样,嫌弃IDE打开速度太慢?VS2010需要12秒 ...
- NSURLConnection ignore unverified certificate error when sending a synchronise request
Private API, use with caution. As we all know, it's easy to ignore the unverified certificate error ...
- .NET研发人员面试题(二)
1.当使用new BB()创建BB的实例时,产生什么输出? public class AA { public AA() { PrintFields(); } public virtual void P ...
- ASP.Net网站部署失败
部署站点时候,出现如下错误 “/”应用程序中的服务器错误. ---------------------------------------------------------------------- ...
- 使用dxNavBar动态创建应用程序菜单
一.如何动态创建dxNavBar内容: function TMain.GetAcitonByCaption(const aCategory,aCaption: string): Integer; va ...