欢迎访问~原文出处——博客园-zhouzhendong

去博客园看该题解


题目传送门 - BZOJ1068


题目概括

  (其实是复制的)

  给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复信息。压缩后的字符串除了小写字母外还可以(但不必)包含大写字母R与M,其中M标记重复串的开始,R重复从上一个M(如果当前位置左边没有M,则从串的开始算起)开始的解压结果(称为缓冲串)。 bcdcdcdcd可以压缩为bMcdRR,下面是解压缩的过程。

  另一个例子是abcabcdabcabcdxyxyz可以被压缩为abcRdRMxyRz。


题解

  这又是一道字符串的题目。

  记得有人说过——字符串的题目就是哈希+乱搞????

  言归正传:

  一看就是一道区间动归。

  所以我们用:

    g[i][j]表示禁止更新缓冲,但是允许解压R的情况 (最短值)
    f[i][j]表示允许更新缓冲,但是禁止解压R的情况 (最短值)

  于是只需要写两个记忆化dfs就可以了。

  具体操作看代码。


代码

#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=+;
char str[N];
int n,g[N][N],f[N][N];
// g[i][j]表示禁止更新缓冲,但是允许解压R的情况
// f[i][j]表示允许更新缓冲,但是禁止解压R的情况
bool can_fold[N][N];
bool fold_check(int L,int R){
int len=R-L+;
if (len&)
return ;
int M=L+len/;
for (int i=;i<len/;i++)
if (str[L+i]!=str[M+i])
return ;
return ;
}
int G(int L,int R){
if (L>R)
return ;
if (g[L][R]!=-)
return g[L][R];
g[L][R]=R-L+;
for (int i=;L+i*-<=R;i++){
int M=L+i*-;
if (can_fold[L][M])
g[L][R]=min(g[L][R],G(L,L+i-)++(R-M));
}
return g[L][R];
}
int F(int L,int R){
if (L>R)
return ;
if (f[L][R]!=-)
return f[L][R];
f[L][R]=G(L,R);
for (int i=L;i<=R;i++)
f[L][R]=min(f[L][R],min(G(L,i)++F(i+,R),G(L,i)+(R-i)));
return f[L][R];
}
int main(){
scanf("%s",str+);
n=strlen(str+);
memset(can_fold,,sizeof can_fold);
for (int i=;i<=n;i++)
for (int j=i;j<=n;j++)
can_fold[i][j]=fold_check(i,j);
memset(f,-,sizeof f);
memset(g,-,sizeof g);
for (int i=;i<=n;i++)
f[i][i]=g[i][i]=;
printf("%d",F(,n));
return ;
}

最新文章

  1. 了解HTML图像
  2. 配置apache和nginx的tomcat负载均衡
  3. split,slice,splice,replace的用法
  4. Sentinel-Redis高可用方案(二):主从切换
  5. PHPStorm Xdebug配置
  6. @SuppressWarnings有什么用处?
  7. Objective-C之@class的使用
  8. Yii zii.widgets.grid 隐藏列 方便js获取隐藏值
  9. ZOJ 3603 Draw Something Cheat
  10. idea免费破解
  11. IMPLEMENTING A GRU/LSTM RNN WITH PYTHON AND THEANO - 学习笔记
  12. 【BZOJ2655】calc DP 数学 拉格朗日插值
  13. Ansible and FileBeta
  14. Python多进程vs多线程
  15. java笔记--问题总结
  16. java中&lt;load-on-startup&gt;含义
  17. iOS开发学习-放大长图与屏幕等宽
  18. Appium - WebView測试(Android)
  19. Linux进程之Fork函数
  20. 探寻IIS最大并发数

热门文章

  1. Keil5下载STM32库
  2. sql 把多列内容合并
  3. 攻打医院服务器的SamSam勒索木马分析
  4. Getting started with machine learning in Python
  5. 出现“error LNK1169: 找到一个或多个多重定义的符号”的原因
  6. mysql锁表与不锁表设置主从复制的方法
  7. saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入
  8. Expm 1_2 实现快速排序的算法,并尝试采用不同的方法实现线性的划分过程.
  9. Node.js Error: listen EADDRNOTAVAIL
  10. javascript 搞不清原型链和constructor