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\)位置之后的最短字串长度. 转移有三类,用刷表法来实现. 第一种是直接往压缩串后面填字符,这样 ...
随机推荐
- 除去重复记录distinct
在查询数据库时候,可以使用distinct关键字过滤重复记录 例如 SELECT distinct ShiftID FROM [AdventureWorks].[HumanResources].[Em ...
- 问题-[DelphiXE2]编译程序体积大的问题
作者:cashfly 发布:2012-03-27 15:12 最近准备换Delphi高版本来写程序,以前一直用7.想体验一下新版本带来的便捷,首先有一个体积问题,看下文介绍. 首先,在IDE里可以直接 ...
- POJ 1657 Distance on Chessboard 简单的计算问题
Distance on Chessboard Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 23096 Accepted ...
- ThinkPHP3.1快速入门(2)数据CURD
上一篇中,我们了解了ThinkPHP的基础部分,以及如何创建一个控制器和模板,并知道了M方法的用法,本篇将会讲解下数据的CURD操作,探索下更多的数据操作. CURD CURD是一个数据库技术中的缩写 ...
- mysql数据库表中判断字段是否存在,如果不存在则创建该字段
$key_answer = 'answer'.$question_num; $test_question = mysql_query('DESCRIBE question_manage {$key_q ...
- 让ie9之前的版本支持canvas
原来google的研发人员早就帮我们解决了这问题. 在这里我们得首先感谢google 在这链接http://excanvas.sourceforge.net/ 下载下来后 吧excanvas.js引入 ...
- SignalR安装以及安装问题
正常节奏 介绍 SignalR 是 ASP.NET 团队正在开发的一个 Microsoft .NET Framework 库和 jQuery 插件,可能包括在以后版本的 ASP.NET 平台中. 它提 ...
- 多媒体应用-swift
照片选择主要是通过UIImagePickerController控制器实例化一个对象,然后通过self.PresentViewController方法推出界面显示.需要实现代理UIImagePicke ...
- Verilog-1995 VS Verilog-2001
http://www.cnblogs.com/tshell/p/3236476.html 2001年3月IEEE正式批准了Verilog‐2001标准(IEEE1364‐2001),与Verilog‐ ...
- 关于FPGA异步时钟采样--结绳法的点点滴滴
一.典型方法 典型方法即双锁存器法,第一个锁存器可能出现亚稳态,但是第二个锁存器出现亚稳态的几率已经降到非常小,双锁存器虽然不能完全根除亚稳态的出现(事实上所有电路都无法根除,只能尽可能降低亚稳态的出 ...