【ZJ选讲·压缩】
给一个由小写字母组成的字符串(len<=50)
我们可以用一种简单的方法来压缩其中的重复信息。
用M,R两个大写字母表示压缩信息 M标记重复串的开始,
R表示后面的一段字符串重复从上一个M到R之前的那一段。
(一开始字符串最前面有一个不用写出来的M)
来点神奇例子: abcabcdabcabcdxyxyz abcRdRMxyRz 问压缩后的最短长度
【题解】
①区间DP。
②f[i][j][0/1]表示区间[i,j]中间是否填'M'
状态转移的特点是拆分区间左边没M右边有M然后右边继续左右操作
1).dp[l][r][0]=min{dp[l][r][0],dp[l][i][0]+r-i} 表示i~r不压缩
2).如果区间长度(r-l+1)%2==0且前后两段字符相同(s[l~mid]==s[mid+1~r])
dp[l][r][0]=min(dp[l][r][0],dp[l][mid][0]+1) 表示放一个R在mid和mid+1之间
3).dp[l][r][1]=min{dp[l][r][1],min(dp[l][i][0],dp[l][i][1])+1+min(dp[i+1][r][0],dp[i+1][r][1])} 表示在i,i+1之间放一个M,那么l~i和i+1~r就是两个独立的区间了。
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
char s[55];
bool vis[55][55];
int dp[55][55][2],n;
bool check(int l,int m){
for(int i=0;l+i<m;i++)
if(s[l+i]!=s[m+i]) return 0;
return 1;
}
void dfs(int l,int r){
if(vis[l][r]) return;
vis[l][r]=1;
for(int i=l;i<r;i++) dfs(l,i),dfs(i+1,r);
int &ret0=dp[l][r][0],&ret1=dp[l][r][1];
ret0=ret1=r-l+1;
//1
for(int i=l;i<r;i++)
ret0=min(ret0,dp[l][i][0]+r-i);
//2
if((r-l+1)%2==0){
int mid=(l+r)>>1;
if(check(l,mid+1)) ret0=min(ret0,dp[l][mid][0]+1);
}
//3
for(int i=l;i<r;i++)
ret1=min(ret1,min(dp[l][i][0],dp[l][i][1])+1+min(dp[i+1][r][0],dp[i+1][r][1]));
}
int main(){
scanf("%s",s+1);
n=strlen(s+1);
dfs(1,n);
printf("%d",min(dp[1][n][0],dp[1][n][1]));
return 0;
}//*ZJ
.
【ZJ选讲·压缩】的更多相关文章
- 【ZJ选讲·字符串折叠】
给一个字符串(len<=100) 把这个字符串折叠(就是压缩) 记 X(子串) 表示重复 X次该子串 比如 3(orz) orzorzorz 来点神奇例子: AAAAAAAAAA ...
- 【ZJ选讲·画山】
给出一张纸(N × M),你要在上面画山,但不能画出界(N,M<=100) Like this: 起点为(0,0),终点为(N,0) 给出w种线段画法(x,y),表示用了这种画法后,笔迹末 ...
- 【ZJ选讲·调整】
给出n个点,m条有向边(带正权),起点S,终点T.(n<=2000,m<=30000) 再给出一个k,表示可以把最多k条边的权值调整为任意非负整数.(k<=100) 问是否可以通 ...
- 【ZJ选讲·钻石游戏】
N×M的棋盘(M,N<=500)中,每个格子有一个颜色(颜色数1~9) P次操作(P<=1000),每次给出两个相邻的位置(保证颜色不同,两个格子有一条公共边),把这两个格子交换. 定 ...
- 【ZJ选讲·BZOJ 5073】
小A的咒语 给出两个字符串A,B (len<=105) 现在可以把A串拆为任意段,然后取出不超过 x 段,按在A串中的前后顺序拼接起来 问是否可以拼出B串. [题解] ①如果遇 ...
- 【ZJ选讲·BZOJ 5071】
小A的数字 有一串数字A1 ,A2,--,An,每次可以进行如下骚操作: 选择一个数字i,将(Ai-1,Ai,Ai+1)变为(Ai-1+Ai,-Ai,Ai+1+Ai), (特别地,若i=N,则( ...
- DP选讲
$DP$选讲直接上题吧放个题单[各省省选DP](https://www.luogu.com.cn/training/151079)$P5322[BJOI2019]$排兵布阵一眼题,考虑$dp[i][j ...
- PJ可能会用到的动态规划选讲-学习笔记
PJ可能会用到的动态规划选讲-学习笔记 by Pleiades_Antares 难度和速度全部都是按照普及组来定的咯 数位状压啥就先不讲了 这里主要提到的都是比较简单的DP 一道思维数学巧题(补昨天) ...
- PJ考试可能会用到的数学思维题选讲-自学教程-自学笔记
PJ考试可能会用到的数学思维题选讲 by Pleiades_Antares 是学弟学妹的讲义--然后一部分题目是我弄的一部分来源于洛谷用户@ 普及组的一些数学思维题,所以可能有点菜咯别怪我 OI中的数 ...
随机推荐
- Hadoop(24)-Hadoop优化
1. MapReduce 跑得慢的原因 优化方法 MapReduce优化方法主要从六个方面考虑:数据输入.Map阶段.Reduce阶段.IO传输.数据倾斜问题和常用的调优参数. 数据输入 Map阶段 ...
- 一个 mr 作业跑的比较慢,如何来优化。
mr跑的慢可能有很多原因,如:数据倾斜.map和reduce数设置不合理.reduce等待过久.小文件过多.spill 次数过多. merge 次数过多等. 1.解决数据倾斜:数据倾斜可能是parti ...
- Android开发——View绘制过程源码解析(二)
0. 前言 View的绘制流程从ViewRoot的performTraversals开始,经过measure,layout,draw三个流程,之后就可以在屏幕上看到View了.上一篇已经介绍了Vi ...
- 程序在Linux下前后台切换
程序在Linux下前后台切换 一.为什么要使程序在后台执行 背景:SecureCRT远程连接到linux主机,使程序在后台运行有以下好处: (1)本机关机不影响linux主机运行 (2)不影响计算效率 ...
- 利尔达NB-IOT模块对接移动onenet平台步骤
1. 首先登陆浙江移动onenet网站,http://openiot.zj.chinamobile.com/,进入右上角的开发者中心,然后才能看到创建产品 2. 填写产品的信息,其他信息按照个人实际填 ...
- model的index无限次数执行导致stackOverFlow
model的index无限次数执行导致stackOverFlow
- (4)分布式下的爬虫Scrapy应该如何做-规则自动爬取及命令行下传参
本次探讨的主题是规则爬取的实现及命令行下的自定义参数的传递,规则下的爬虫在我看来才是真正意义上的爬虫. 我们选从逻辑上来看,这种爬虫是如何工作的: 我们给定一个起点的url link ,进入页面之后提 ...
- python正则-字符串处理,主要用于处理请求参数格式为application/x-www-form-urlencoded的表单数据
#当提交的表单数据格式为application/x-www-form-urlencoded,直接从浏览器复制出来的格式是str_lin(chrome,也是最常见的)或者str_in2(火狐)这两种格式 ...
- 第九篇 Python数据类型之集合
集合 set 写在最前,必须要会的:1.长度len2.成员运算in和not in3.|合集4.&交集5.-差集6.^对称差集7.==8.父集:>,>= 9.子集:<,< ...
- DPDK如何抓包
原创翻译,转载请注明出处. DPDK的librte_pdump库,提供了在DPDK框架下抓包的功能.这个库通过完全复制Rx和Tx的mbuf到一个新的内存池,因此它降低应用程序的性能,所以只推荐在调试的 ...