http://www.lydsy.com/JudgeOnline/problem.php?id=1068

Description

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

  另一个例子是abcabcdabcabcdxyxyz可以被压缩为abcRdRMxyRz。

Input

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

Output

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

Sample Input

bcdcdcdcdxcdcdcdcd

Sample Output

12

————————————————————————————-

显然是一道区间dp,然而我不会做。

参考:http://blog.csdn.net/u012288458/article/details/51674096

设f[i][j][0/1]表示i到j(不存在/存在)M,且默认i-1~i处有一个M。

那么状态转移方程很好想到为:

f[i][j][]=min(f[i][j][],f[i][k][]+j-k);
f[i][j][]=min(f[i][j][],f[i][k][]+j-k);
f[i][j][]=min(f[i][j][],f[i][k][]+f[k+][j][]+);

PS:k的含义为[i,j)中的一个数。

PPS:对于第三个式子,我们已经默认了k~k+1处有一个M,所以答案应当+1

接下来想压缩,我们可以直接考虑对一整个区间压缩,其必要条件就是区间长为偶数,且区间左边字符=区间右边字符。

如果符合,我们就有以下式子:

f[i][j][]=min(f[i][j][],f[i][k-][]+);
f[i][j][]=min(f[i][j][],f[i][k-][]+);

PS:k的含义为区间中点(向上取整)

PPS:不要忘记我们加的R!

于是这题就做完了(dp使我头凸……T0T)

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int N=;
int f[N][N][];
char s[N];
bool check(int z,int t,int l){
for(int i=;i<l;i++){
if(s[z+i]!=s[t+i])return ;
}
return ;
}
int main(){
cin>>s+;
int n=strlen(s+);
for(int i=;i<=n;i++)f[i][i][]=f[i][i][]=;
for(int l=;l<=n;l++){
for(int i=;i<=n;i++){
int j=i+l;
if(j>n)break;
f[i][j][]=f[i][j][]=l+;
for(int k=i;k<j;k++){
f[i][j][]=min(f[i][j][],f[i][k][]+j-k);
f[i][j][]=min(f[i][j][],f[i][k][]+j-k);
f[i][j][]=min(f[i][j][],f[i][k][]+f[k+][j][]+);
}
if(l%){
int k=i+j+>>;
if(check(i,k,l+>>)){
f[i][j][]=min(f[i][j][],f[i][k-][]+);
f[i][j][]=min(f[i][j][],f[i][k-][]+);
}
}
}
}
printf("%d\n",min(f[][n][],f[][n][]));
return ;
}

BZOJ1068:[SCOI2007]压缩——题解的更多相关文章

  1. BZOJ1068: [SCOI2007]压缩

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

  2. BZOJ1068 [SCOI2007]压缩 区间动态规划 字符串

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1068 题目概括 (其实是复制的) 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中 ...

  3. BZOJ1068 [SCOI2007]压缩 【区间dp】

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

  4. 2018.10.20 bzoj1068: [SCOI2007]压缩(区间dp)

    传送门 这题转移很妙啊. f[l][r][1/0]f[l][r][1/0]f[l][r][1/0]表示对于区间[l,r][l,r][l,r]有/无重复的机会时压缩的最小值. 那么可以从三种情况转移过来 ...

  5. 洛谷P2470||bzoj1068 [SCOI2007]压缩

    bzoj1068 洛谷P2470 区间dp入门题?只要注意到每个M“管辖”的区间互不相交即可 错误记录:有点小坑,比如aaaacaaaac最优解为aRRcR(意会坑在哪里),踩了一次 #include ...

  6. 【BZOJ1068】压缩(动态规划)

    [BZOJ1068]压缩(动态规划) 题面 BZOJ 洛谷 题解 比较简单的\(dp\) 设\(f[i][j]\)表示当前已经匹配到了原串的第\(i\)个位置,上一个\(M\)在第\(j\)个字符之后 ...

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

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

  8. 【BZOJ-1068】压缩 区间DP

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 1001  Solved: 615[Submit][Status][ ...

  9. bzoj 1068: [SCOI2007]压缩 DP

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

随机推荐

  1. PLSQL集合类型

    PLSQL集合类型   --联合数组(索引表) /* 用于存储某个数据类型的数据集合类型 .通过索引获得联合数组中得值 如下例子: */ DECLARE CURSOR cur_chars IS SEL ...

  2. 查看python中包的文档

    核心命令:python -m pydoc 查询某包:python -m pydoc 包名 示例: C:\Users\xxx>python -m pydoc pydoc - the Python ...

  3. HPUX 11.31 MC/SG恢复丢失的锁盘

    有时候由于一些特殊的原因,用户的cluster中的锁盘信息丢失,或者需要更换锁盘,只要执行一个命令就可以了. #cmdisklock reset /dev/vglock:/dev/disk/diskX ...

  4. parity 注记词

    spousal tint untold around rosy daintily unrated sheep choice showpiece chirping gala

  5. hadoop问题集(1)

        参考: http://dataunion.org/22887.html 1.mapreduce_shuffle does not exist 执行任何时报错: Container launch ...

  6. 【转】Charles 从入门到精通

    目录与版权 转载请保留顶部的 Charles 中国特惠内容,本文的内容主要包括: Charles 的简介 如何安装 Charles 将 Charles 设置成系统代理 Charles 主界面介绍 过滤 ...

  7. Python—集合(在我的世界,你就是唯一)

    一.概念与定义 集合类型与数学中集合的概念一致,即包含0个或多个数据项的无序组合. 元素不可重复,只能是固定数据类型元素. 集合(set)属于Python无序可变序列,使用一对大括号作为定界符,元素之 ...

  8. 2017秋软工1 - 本周PSP

    1.本周PSP 2. 本周PSP饼状图 3. 本周进度条 4. 累计进度图

  9. 《剑指offer》---把数组排成最小的数

    本文算法使用python3实现 1 题目描述:   输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组 $ [3,32,321] $ ,则打印出这 ...

  10. osg::Vec2 Vec3 Vec4

    osg::Vec2可以用于保存2D纹理坐标. osg::Vec3是一个三维浮点数数组. osg::Vec4用于保存颜色数据.