bzoj1068:[SCOI2007]压缩
思路:区间dp,设状态f[l][r][bo]表示区间[l,r]的答案,bo=1表示该区间可以放M也可以不放M,bo=0表示该区间不能放M,并且对于任意一个状态f,l和l-1之间均有一个M,于是就可以进行转移了。
对于区间[l,r]中的任意位置都可能要放一个M,于是当bo=1时f[l][r][bo]=min(f[l][r][bo],f[l][mid][bo]+1(即M的长度,同时为了让每个状态f前均有一个M)+f[mid+1][r][bo])
同样也可以不放M,只考虑压缩前一段,即f[l][r][bo]=min(f[l][r][bo],f[l][mid][bo]+r-mid)
然后还剩下当前状态压缩的情况(这里有一个坑点,也怪我不看题,一个R压缩的是距离它第一个M到它全部的字符,即使它们之间有R,应该解压之后再压缩,换句话说就是压缩abababab不是abRRR而是abRR,被这里坑了好久还以为hack掉了std。。。。),即当前状态能被完全压缩当且仅当它是由2^x个相等的字串组成的,因此每次折半判断即可。
f[l][r][bo]=min(f[l][r][bo],f[l][(l+r)>>1][0]+1(1即R的长度)) 然后一定要判当前区间长度是否是偶数,而且必须由bo是0的状态转移过来,因为这段区间如果再放M,那压缩的就不再是前面一整段了。。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
#define maxn 55
#define inf 1e9 char s[maxn];
int f[maxn][maxn][]; bool check(int l,int r,int len){
int mid=(l+r)>>;
for (int i=l;i<=mid;i++)
if (s[i]!=s[i+len]) return ;
return ;
} int dp(int l,int r,int bo){
if (l==r) return f[l][r][bo]=/*+((bo==1)?inf:0)*/;
if (f[l][r][bo]) return f[l][r][bo];
int n=r-l+;f[l][r][bo]=r-l+;
if (bo) for (int mid=l;mid<r;mid++) f[l][r][bo]=min(f[l][r][bo],dp(l,mid,bo)++dp(mid+,r,bo));
for (int mid=l;mid<r;mid++) f[l][r][bo]=min(f[l][r][bo],dp(l,mid,bo)+r-mid);
if (!(n&) && check(l,r,n/)) f[l][r][bo]=min(f[l][r][bo],dp(l,l+n/-,)+);
return f[l][r][bo];
} int main(){
scanf("%s",s+);
printf("%d\n",dp(,strlen(s+),));
return ;
}
bzoj1068:[SCOI2007]压缩的更多相关文章
- BZOJ1068: [SCOI2007]压缩
... 1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 909 Solved: 566[Submit][Statu ...
- BZOJ1068 [SCOI2007]压缩 区间动态规划 字符串
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1068 题目概括 (其实是复制的) 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中 ...
- 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]有/无重复的机会时压缩的最小值. 那么可以从三种情况转移过来 ...
- BZOJ1068 [SCOI2007]压缩 【区间dp】
题目 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位 ...
- 洛谷P2470||bzoj1068 [SCOI2007]压缩
bzoj1068 洛谷P2470 区间dp入门题?只要注意到每个M“管辖”的区间互不相交即可 错误记录:有点小坑,比如aaaacaaaac最优解为aRRcR(意会坑在哪里),踩了一次 #include ...
- 【BZOJ-1068】压缩 区间DP
1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1001 Solved: 615[Submit][Status][ ...
- bzoj 1068: [SCOI2007]压缩 DP
1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 496 Solved: 315[Submit][Status] D ...
- 【BZOJ1068】压缩(动态规划)
[BZOJ1068]压缩(动态规划) 题面 BZOJ 洛谷 题解 比较简单的\(dp\) 设\(f[i][j]\)表示当前已经匹配到了原串的第\(i\)个位置,上一个\(M\)在第\(j\)个字符之后 ...
- bzoj 1068 [SCOI2007]压缩 区间dp
[SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1644 Solved: 1042[Submit][Status][Discu ...
- [SCOI2007]压缩(动态规划,区间dp,字符串哈希)
[SCOI2007]压缩 状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样 ...
随机推荐
- Storm系列(五)架构分析之Nimbus启动过程
启动流程图 mk-assignments 功能:对当前集群中所有Topology进行新一轮的任务调度. 实现源码路径: \apache-storm-0.9.4\storm-core\src\clj ...
- Linux内核系列设备模型(一) Kobject与Kset
1.Kobject Kobject是设备驱动模型的核心结构,它使所有设备在底层都有统一的接口.在内核注册的kobject对象都会对应sysfs文件系统中的一个目录(目录名称有Kobject结构中k_n ...
- 费用提前计算相关的DP(BZOJ2037,POJ3042,ZOJ3469)
在刷ZeroClock大神的区间DP专辑,遇见了ZOJ3469,完全不无从下手,然后有人说是论问题,推荐看徐源盛<对一类动态规划问题的研究>这篇论文,果断得膜拜了下,感觉好神奇,可以把未来 ...
- ffmpeg编解码音频AAC
本次项目的需求:手机端和PC端共享同一个音视频网络源. 所以编解码需要满足手机上编码和解码原来PC端的音视频流. 这里先封装安卓手机端音频的编解码. 编译工作依然是在linux下 ubuntu 12. ...
- 问题-[DelphiXE2]提示第三控件不存在
问题情况:在DelphiXE2启动时界面显示加载了控件,并且控件的路径也放在了环境变量中,但打开程序报第三控件不存在. 问题原因:是没有选择要加载的控件. 问题处理:点击Component->I ...
- java多态/重载方法——一个疑难代码引发的讨论
直接上代码,看这个代码发现自己的基础有多差了.参考 http://www.cnblogs.com/lyp3314/archive/2013/01/26/2877205.html和http://hxra ...
- Redis_基本类型介绍和指令___2
1.hash Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象. Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿). ...
- DELPHI TDownLoadURL下载网络文件
DELPHI XE6 FMX 附件:http://files.cnblogs.com/xe2011/IDHttp_fmx.7z unit Unit1; interface uses //引用 Vc ...
- Redis学习手册(Set数据类型)
一.概述: 在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加.删除或判断某一元素是否存在等操作.需要说明的是,这些操作的时间复杂度 ...
- java08 Set
Set: 无序不可重复,重复则覆盖,判断是不是重复也是通过equals方法判断的.HashSet和TreeSet,HashSet底层是HashMap. public static void main( ...