BZOJ1068 [SCOI2007]压缩 区间动态规划 字符串
2024-10-18 11:33:47
欢迎访问~原文出处——博客园-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 ;
}
最新文章
- 了解HTML图像
- 配置apache和nginx的tomcat负载均衡
- split,slice,splice,replace的用法
- Sentinel-Redis高可用方案(二):主从切换
- PHPStorm Xdebug配置
- @SuppressWarnings有什么用处?
- Objective-C之@class的使用
- Yii zii.widgets.grid 隐藏列 方便js获取隐藏值
- ZOJ 3603 Draw Something Cheat
- idea免费破解
- IMPLEMENTING A GRU/LSTM RNN WITH PYTHON AND THEANO - 学习笔记
- 【BZOJ2655】calc DP 数学 拉格朗日插值
- Ansible and FileBeta
- Python多进程vs多线程
- java笔记--问题总结
- java中<;load-on-startup>;含义
- iOS开发学习-放大长图与屏幕等宽
- Appium - WebView測试(Android)
- Linux进程之Fork函数
- 探寻IIS最大并发数
热门文章
- Keil5下载STM32库
- sql 把多列内容合并
- 攻打医院服务器的SamSam勒索木马分析
- Getting started with machine learning in Python
- 出现“error LNK1169: 找到一个或多个多重定义的符号”的原因
- mysql锁表与不锁表设置主从复制的方法
- saltstack自动化运维系列④之saltstack的命令返回结果mysql数据库写入
- Expm 1_2 实现快速排序的算法,并尝试采用不同的方法实现线性的划分过程.
- Node.js Error: listen EADDRNOTAVAIL
- javascript 搞不清原型链和constructor