bzoj1068 [SCOI2007]压缩(区间DP)
2017-12-17 13:09
519 查看
bzoj1068 [SCOI2007]压缩
原题地址:http://www.lydsy.com/JudgeOnline/problem.php?id=1068题意:
给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息。压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串)。
bcdcdcdcd可以压缩为bMcdRR,下面是解压缩的过程:
另一个例子是abcabcdabcabcdxyxyz可以被压缩为abcRdRMxyRz。
给出一个字符串,求压缩后字符串的最短长度。
数据范围
1<=n<=50
题解:
好题。
其实和正解的思路相似,要在后边添加R肯定要知道M在哪,于是状态定义容易想到有无M这一点。但就是闹不清这个M怎么加加减减。
于是贴正解:
dp[l][r][0/1]表示在默认前边(l-1)有一个M的情况下,
区间[l,r]没有M/有M能够压缩的最短长度。
于是:
dp[l][r][0]=min(dp[l][k][0]+r−k)(因为dp[][][]默认前边有一个M,所以不是加dp[k+1][r][0])
dp[l][r][0]=dp[l][mid][0]+1 仅当l-r+1位偶数且两半相同时,在后边添一个R。
dp[l][r][1]=min( min(dp[l][k][0],f[l][k][1])+1+min(dp[k+1][r][0],dp[k+1][r][1]) )
有个M,枚举这个M在哪。
默认前边(l-1)有一个M的状态定义很巧妙,让很多问题都简化了,省去了众多讨论。
代码:
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; const int N=55; const int inf=0x3f3f3f3f; int f [2],n; char s ; bool check(int l,int mid,int r) { for(int i=l;i<=mid;i++) if(s[i]!=s[mid+i-l+1]) return 0; return 1; } int dp(int l,int r,int m) { int len=(r-l+1); if(len==1) return f[l][r][m]= m?inf:1; if(f[l][r][m]<inf) return f[l][r][m]; if(m) { for(int k=l;k<r;k++) f[l][r][m]=min(f[l][r][m],min(dp(l,k,0),dp(l,k,1))+min(dp(k+1,r,0),dp(k+1,r,1))+1); return f[l][r][m]; } int mid=(l+r)>>1; if(len%2==0&&check(l,mid,r)) f[l][r][m]=min(f[l][r][m],dp(l,mid,m)+1); for(int k=l;k<=r;k++) f[l][r][m]=min(f[l][r][m],dp(l,k,m)+r-k); return f[l][r][m]; } int main() { scanf("%s",s+1); n=strlen(s+1); memset(f,0x3f,sizeof(f)); printf("%d\n",min(dp(1,n,0),dp(1,n,1))); return 0; }
相关文章推荐
- bzoj 1068: [SCOI2007]压缩【区间dp】
- 【bzoj1068】[SCOI2007]压缩 区间dp
- [bzoj1068][SCOI2007]压缩 区间dp
- 【BZOJ 1068】【SCOI 2007】压缩 【区间DP】
- BZOJ 1068: [SCOI2007]压缩 | 区间DP
- BZOJ1068 [SCOI2007]压缩 【区间dp】
- [BZOJ1068][SCOI2007]压缩(区间DP)
- 【bzoj 1068】[SCOI2007]压缩 区间dp
- [BZOJ1068]-[SCOI2007]压缩-区间DP
- 【BZOJ1068】[SCOI2007]压缩【区间DP】
- 【BZOJ】1068: [SCOI2007]压缩(dp)
- [BZOJ 1068][SCOI 2007]压缩(DP)
- BZOJ 1068: [SCOI2007]压缩 划分DP,记忆化搜索
- BZOJ 1068 [SCOI 2007] 区间DP 解题报告
- bzoj 1068: [SCOI2007]压缩 DP
- bzoj1068[SCOI2007]压缩
- bzoj1068 [SCOI2007]压缩
- 【BZOJ 1068】[SCOI2007]压缩
- bzoj 1068: [SCOI2007]压缩
- [bzoj1072][SCOI2007]排列(状态压缩DP)