Sol

区间DP.这个区间DP需要三维, \(f[i][j][k]\) 表示\([i,j]\) 这个区间中是否存在 \(M\) .

转移有两种,一种是这个区间存在 \(M\) ,那么直接枚举 \(M\) 的位置就可以了;另一种是没有 \(M\) ,那么从中间劈来,如果两边一样,显然是左边没有 \(M\) 的答案+1就可以了,还有种情况就是 左边压缩右边不压缩就行了.

随便加个记忆化搜索就行了,出口就是 \(L==R\) 如果 \(k==0\) 显然答案为1; \(k==1\) 不存在,赋个大数就可以了.

PS:这题一开始写了个70分的...不是前七十...中间有WrongAnswer的.

Code

/**************************************************************
Problem: 1068
User: BeiYu
Language: C++
Result: Accepted
Time:20 ms
Memory:1312 kb
****************************************************************/ #include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; #define debug(a) cout<<#a<<"="<<a;
const int N = 55;
const int INF = 55; char c[N];
int f[N][N][2]; int pd(int l,int r){
int mid=(l+r)>>1;
for(int i=l,j=mid+1;j<=r;i++,j++) if(c[i]!=c[j]) return 0;
return 1;
}
int DP(int L,int R,int k){
int &res=f[L][R][k];if(~res) return res;
if(L>R) return res=0;if(L==R){ if(k) return res=INF;else return res=1; }
int lenth=R-L+1;res=lenth;
if(k){
for(int i=L;i<R;i++){
res=min(res,DP(L,i,0)+DP(i+1,R,0)+1);
res=min(res,DP(L,i,0)+DP(i+1,R,1)+1);
res=min(res,DP(L,i,1)+DP(i+1,R,0)+1);
res=min(res,DP(L,i,1)+DP(i+1,R,1)+1);
}return res;
}if((lenth&1)==0&&pd(L,R)) res=min(res,DP(L,L+(lenth>>1)-1,0)+1);
for(int i=L;i<R;i++) res=min(res,DP(L,i,0)+R-i);
return res;
}
int main(){
scanf("%s",c+1);int n=strlen(c+1);
memset(f,-1,sizeof(f));cout<<min(DP(1,n,0),DP(1,n,1))<<endl;
return 0;
}

  

BZOJ 1068: [SCOI2007]压缩的更多相关文章

  1. bzoj 1068: [SCOI2007]压缩 DP

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

  2. [BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】

    题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + S ...

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

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

  4. bzoj 1068: [SCOI2007]压缩【区间dp】

    神区间dp 设f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内只有这一个M,f[l][r][0]为在l到r中压缩的第一个字符为M,并且区间内有两个及以上的M 然后显然的转移是f[i][ ...

  5. 【BZOJ】1068: [SCOI2007]压缩(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...

  6. 1068: [SCOI2007]压缩 - BZOJ

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

  7. 1068: [SCOI2007]压缩

    题解: 区间DP 考虑状态的设计: \(dp[i][j][0/1]\)表示原字符串的\(i-j\)区间有无在中间加\(M\).并且默认在\(i\)之前加入\(M\)压缩后的最小长度,显然有转移: \[ ...

  8. 1068. [SCOI2007]压缩【区间DP】

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

  9. BZOJ1068: [SCOI2007]压缩

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

随机推荐

  1. Java——jar命令

    把*.class压缩成一个文件,这样的文件就称为jar文件. 如果想要生成jar文件,直接使用JDK中bin目录里的jar.exe就可以将所有的类文件进行压缩. 当用户得到一个jar文件后,即可通过设 ...

  2. C# C++联调

    http://jingyan.baidu.com/article/fcb5aff7926344edab4a714d.html

  3. Hiredis 基本使用

    0. 前言 Hiredis是一个Redis的C客户端库函数,基本实现了Redis的协议的最小集.这里对hiredis的api作基本的介绍以及应用,主要参考hiredis的README文件以及相关源码. ...

  4. mssql注入

    <%@ Page Language="C#" AutoEventWireup="true" %> <%@ Import Namespace=& ...

  5. python 跨语言数据交互、json、pickle(序列化)、urllib、requests(爬虫模块)、XML。

    Python中用于序列化的两个模块 json     用于[字符串]和 [python基本数据类型] 间进行转换 pickle   用于[python特有的类型] 和 [python基本数据类型]间进 ...

  6. Ubuntu 源码安装 nginx 1.9.2

    安装前准备: //更新系统 1.sudo apt-get update //安装pcre包 2.sudo apt-get install libpcre3 libpcre3-dev   3.sudo  ...

  7. java中InvocationHandler 用于实现代理。

    以下的内容部分参考了网络上的内容,在此对原作者表示感谢! Java中动态代理的实现,关键就是这两个东西:Proxy.InvocationHandler,下面从InvocationHandler接口中的 ...

  8. Xcode常用技巧(2)-使Xcode在创建类时自动添加前缀

    在Xcode5之前的版本中,Xcode在新建项目时,会要求为一个类指定一个前缀,这样方便我们区分相同名字的类.而从Xcode6开始,由于Swift增加了命名空间的关系,Xcode在新建项目时,不会再要 ...

  9. 如何才能实现在点击链接时直接在网页中打开word文档,但不提示保存

    一般要直接打开需要客户端 1.客户端有word支持 2.客户端浏览器的版本与设置 可寻找一下相关的控件或中间件,我的意见是看能否变通一下,把word转成HTML或PDF再展示给用户.(若用户不需要编辑 ...

  10. C#5.0 特性

    Visual Studio 2012 中 Visual C# 的新增功能 Lambda表达式 表达式树:把代码,转换成数据,然后分析数据发现其组成部分,最后转换成可以传递到其他程序的字符串 LinQ表 ...