BZOJ 1068: [SCOI2007]压缩
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]压缩的更多相关文章
- bzoj 1068: [SCOI2007]压缩 DP
1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 496 Solved: 315[Submit][Status] D ...
- [BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】
题目链接:BZOJ - 1068 题目分析 这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些. 需要注意如果某一段是 S1S1 重复,那么可以变成 M + S ...
- bzoj 1068 [SCOI2007]压缩 区间dp
[SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 1644 Solved: 1042[Submit][Status][Discu ...
- 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]压缩(dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1068 发现如果只设一维的话无法转移 那么我们开第二维,发现对于前i个来说,如果确定了M在哪里,第i个 ...
- 1068: [SCOI2007]压缩 - BZOJ
Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一 ...
- 1068: [SCOI2007]压缩
题解: 区间DP 考虑状态的设计: \(dp[i][j][0/1]\)表示原字符串的\(i-j\)区间有无在中间加\(M\).并且默认在\(i\)之前加入\(M\)压缩后的最小长度,显然有转移: \[ ...
- 1068. [SCOI2007]压缩【区间DP】
Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息.压缩后的字符串除了小 写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上 ...
- BZOJ1068: [SCOI2007]压缩
... 1068: [SCOI2007]压缩 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 909 Solved: 566[Submit][Statu ...
随机推荐
- jquery id选择器 id带"."问题
例如控件ID为user.id 使用$("#user.id")不能得到正确的结果 必须使用\\转义 即$("#user\\.id")
- Java数据结构——用链表实现栈
//================================================= // File Name : LinkStack_demo //---------------- ...
- Robot Framework--05 案例设计之流程与数据分离
转自:http://blog.csdn.net/tulituqi/article/details/7651049 这一讲主要说一下案例设计了.还记得我们前面做的case么?先打开浏览器访问百度,输入关 ...
- NopCommerce源码分析ContainerBuilder builder.Update(container)
/// <summary> /// Register dependencies /// </summary> /// <param name="config&q ...
- java批量生成excel代码分享
package com.test.util; /** * @author ocq * */ import java.io.FileOutputStream; import java.io.IOExce ...
- vim关于 引号和 括号的 高效操作-很好很强大的!
http://blog.csdn.net/bigshady/article/details/6019963 对括号匹配, 进行跳转, 使用的是%. 匹配的括号, 都会被高亮显示, 但是: 根据光标的 ...
- linux安装软件通常会做哪些事
一般来说,安装某个包,某个服务,某个软件时,可能会做以下事情(不一定全部) - 在安装目录: /usr/bin, /usr/lib: /usr/you_specified_bin/, /usr/you ...
- 解决pydev报unsolved import的问题
安装Flask_RESTful-0.2.11包后, 并在pydev 对应的 interpreter 重新刷新了System PYTHONPATH, 看见Lib\site-packages\flask_ ...
- Intent和Activity知识点总结
1.Intent的跳转传值2.Intent的隐式启动(用于不同应用中)与显示启动(同一应用中)3.Activity的生命周期 void onCreate()——Activity已经被创建完毕,创 ...
- 微信小程序开放公测了 晚上又可以通宵搞代码了
就在刚刚22:15分,微信公众平台的服务号发来好消息说小程序开放公测了,喜大普奔啊!!!码农们晚上又可以通宵搞测试了.之前还猜测16日微信小论坛小程序专场上会公布,没想到提前了那么多天,效率挺高的,而 ...