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

另一个例子是abcabcdabcabcdxyxyz可以被压缩为abcRdRMxyRz。
Input
输入仅一行,包含待压缩字符串,仅包含小写字母,长度为n。
Output
输出仅一行,即压缩后字符串的最短长度。
Sample Input
Sample Output
HINT
在第一个例子中,解为aaaRa,在第二个例子中,解为bMcdRRxMcdRR。
【限制】
100%的数据满足:1<=n<=50 100%的数据满足:1<=n<=50
艹二维做法艹了好久,竟然还过样例了还有60(惊)
果然还是数据太水了
正解的三维做法非常巧妙
dp[x][y][1\0]表示[x,y]区间内是否有M。默认x-1前面跟着一个M
枚举断点k
dp[x][y][1]就可以从k划分的两个区间的0\1状态转移了。毕竟中间有M了可以为所欲为(雾)
dp[x][y][0]就只能从0的转移过来了。注意如果[x,y]可以从中间一分为二相同的话,还要加一个状态转移
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
char a[];
int dp[][][],n;
int check(int x,int y)
{
int mid=(x+y)/;
for (int i=;i<mid-x+;++i)
if (a[x+i] != a[mid+i+])
return ;
return ;
} int main()
{
scanf("%s",a+);
n=strlen(a+);
memset(dp,0x3f,sizeof(dp));
for (int i=; i<=n; ++i)
{
for (int j=; j<=n-i+; ++j)
{
int x=j,y=j+i-;
dp[x][y][]=dp[x][y][]=y-x+;
for (int k=x; k<y; ++k)
{
dp[x][y][]=min(dp[x][y][],min(dp[x][k][],dp[x][k][])++min(dp[k+][y][],dp[k+][y][]));
dp[x][y][]=min(dp[x][y][],dp[x][k][]+y-k);
if ((y-x+)%== && check(x,y)) dp[x][y][]=min(dp[x][y][],dp[x][(x+y)/][]+);
} }
}
printf("%d",min(dp[][n][],dp[][n][]));
}
1068. [SCOI2007]压缩【区间DP】的更多相关文章
- bzoj 1068 [SCOI2007]压缩 区间dp
[SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1644 Solved: 1042[Submit][Status][Discu ...
- B1068 [SCOI2007]压缩 区间dp
这个题我状态想对了,但是转移错了...dp的代码难度都不大,但是思考含量太高了..不会啊,我太菜了. 其实这个题就是一个正常的区间dp,中间多了一个特判的转移就行了. 题干: Description ...
- [SCOI2007]压缩 区间dp
明显是个区间dp,但是我区间dp就是个渣... f[i][j]表示区间i到j最短的字符长度:假设前面加了个M,所以初始化f[i][i]=2;当然最开始是不算M的,所以f[1][1]=1;然后就可以区间 ...
- 洛谷P2470 [SCOI2007]压缩(区间dp)
题意 题目链接 Sol 神仙题Orz 考虑区间dp,如果我们只设\(f[l][r]\)表示\(s_{lr}\)被压缩的最小长度,而不去关心内部\(M\)分布的话,可能在转移的时候转移出非法状态 因此考 ...
- 【BZOJ】1068: [SCOI2007]压缩(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...
- bzoj 1068: [SCOI2007]压缩 DP
1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 496 Solved: 315[Submit][Status] D ...
- 【BZOJ-1068】压缩 区间DP
1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1001 Solved: 615[Submit][Status][ ...
- bzoj 1068: [SCOI2007]压缩【区间dp】
神区间dp 设f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内只有这一个M,f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内有两个及以上的M 然后显然的转移是f[i][ ...
- BZOJ 1068: [SCOI2007]压缩
Sol 区间DP.这个区间DP需要三维, \(f[i][j][k]\) 表示\([i,j]\) 这个区间中是否存在 \(M\) . 转移有两种,一种是这个区间存在 \(M\) ,那么直接枚举 \(M\ ...
- [BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】
题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + S ...
随机推荐
- Sql函数的三种写法
以前复制的创建sql函数比较乱,现在将我自己项目中的三种sql函数做下对比,一目了然: (1)表值函数——方法一:直接创建临时表,并返回临时表.优点:函数体中间可以直接申明临时变量,并做各种逻辑处理, ...
- 热更新--动态加载framework
1.准备工作:先自己封装一个framework:http://www.cnblogs.com/sunjianfei/p/5781863.html 2.把封装好的framework压缩成zip,放到本地 ...
- Ubuntu16.04 LTS上安装Go1.10
原因 Ubuntu资源库上默认使用的是Go1.6.2版本,给最新版本代码编译带来了不少问题.本文就记录下在Ubuntu下直接安装Go最新版1.10的步骤. 准备工作 1.卸载已有版本 # 卸载已经安装 ...
- Java中响应结果工具类,可自定义响应码,内容,响应消息
创建响应状态码和说明枚举类 /** * 响应状态码和说明 */public enum CodeEnum { SUCCESS(0, "成功!"), FAIL(1, &qu ...
- Android开发之旅4:应用程序基础及组件
引言 为了后面的例子做准备,本篇及接下来几篇将介绍Android应用程序的原理及术语,这些也是作为一个Android的开发人员必须要了解,且深刻理解的东西.本篇的主题如下: 1.应用程序基础 2.应用 ...
- python 函数私有方法
#coding:utf-8 class A(object): def _test1(self): print('this is _test1') def test2(self): print('thi ...
- linux 上传下载 以及SCP命令
1. scp 用法 scp就是用来在服务器和本地之间传文件的linux命令还有其他的方法,比如装ftp服务器 copy 本地的档案到远程的机器上 scp /Desktop/test.conf 用户名@ ...
- Python逐行读取文件内容
更详细的文件按行读取操作可以参考:http://www.cnblogs.com/xuxn/archive/2011/07/27/read-a-file-with-python.html 一行一行得从文 ...
- [转]关于浏览器css选择器性能优化
作为一个前端开发, 我觉得很有必要了解浏览器对css选择器的解析,因为这个关系到页面的渲染,高效的方式.避开开销大的方式这些无疑为网站加载缩短了时间. 最近在新的项目中陷入了一个误区,也是出于对jqu ...
- CSS-带尖角的对话框
效果图: box1的代码: .box{ position: relative; width: 200px; height: 200px; border: 2px solid #000; backgro ...