来源:牛客网:

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

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

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

输入描述:

输入仅一行,包含待压缩字符串,仅包含小写字母,长度为n。

输出描述:

输出仅一行,即压缩后字符串的最短长度。

示例1
输入
复制

bcdcdcdcdxcdcdcdcd

输出
复制

12

题解:

我们先考虑没有M的影响
dp[i][j]表示字符串i到j的最短压缩长度
区间dp,我们可以得到:
第一种:没有相等子串的一般情况时
转移dp [ l ] [ r ] = min ( dp [ l ] [ i ] + dp [ i + 1 ] [ r ] ) (l<=i<=r)
第二种:子串长度是偶数,且可以拆分成两个相等的子串时,此时我们可以进行压缩,
mid=(l+r)>>1,
mid+1到r这一段就可以被一个字符R代替
转移dp[l][r]=min(dp[l][r],f[l][mid]+1)
当考虑有M时,R匹配总是与最近的M匹配
我们可以给状态加一维:
dp[l][r][0/1]表示原串l到r在区间内是否有M的最短长度
如果当前区间左一半和右一半相等且中间没有M,我们可以把后一半换成R(和上面讲的情况一样)
dp[l][r][0]=min(dp[l][r][0],dp[l][i][0]+(r-i))(l<=i<=r)

当区间内有M时,就需要将区间分成M之前和之后两部分压缩,因为R只能匹配最近的M,M之前的就管不了了
然后看拆分后的区间的各自情况(看拆分后的区间是有M好还是没M好),记得要+1,因为多加了一个字符M
dp[l][r][1]=min ( dp [l] [r] [1] , min ( dp[l][i][1] , dp[l][i][0] ) +1)
(l<=i<r)i枚举的是M的位置
以上两步都算是正常情况
当区间[l,r]可以拆分成两个相等的部分[l,mid],[mid+1,r]时,
dp[l][r][0]=min(dp[l][r][0],dp[l][mid][0]+1)
最后答案就是取最小值min(dp[1][n][0],dp[1][n][1])

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=85;
int dp[maxn][maxn][maxn];
int ans[maxn];
inline int read()
{int s=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(!isdigit(ch)){s=(s<<3)+(s<<1)+ch-48;ch=getchar();}return s*f;}
string s;
bool check(int l,int r)//检验左右区间是否相等
{int mid=(l+r)>>1;for(int i=l;i<=mid;i++){if(s[i]!=s[mid+i-l+1])return 0;}return 1;
}
int main()
{cin>>s;int leng=s.length();s=" "+s;for(int len=1;len<=leng;++len){//从头开始枚举长度 for(int i=1;i+len-1<=leng;++i){int j=i+len-1;dp[i][j][0]=dp[i][j][1]=len;for (int k=i;k<=j;++k){//从k将区间分为两部分 dp[i][j][0]=min(dp[i][j][0],dp[i][k][0]+j-k);dp[i][j][1]=min(dp[i][j][1],min(dp[i][k][1],dp[i][k][0])+min(dp[k+1][j][0],dp[k+1][j][1])+1);}if(len%2==0&&check(i,j))//如果是偶数,且左右两区间相等dp[i][j][0]=min(dp[i][j][0],dp[i][(i+j)>>1][0]+1);}}cout<<min(dp[1][leng][0],dp[1][leng][1]);return 0;
}

【每日一题】7月14日题目精讲—压缩相关推荐

  1. 牛客网 每日一题 7月23日题目精讲—wpy的请求

    来源:牛客网: 文章目录 wpy的请求 题解: 代码: wpy的请求 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K Special Judge ...

  2. 牛客网【每日一题】4月14日题目精讲 Xorto

    文章目录 题目描述 题解: 代码: 扩展 传送 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format:%lld 题目描述 ...

  3. 【每日一题】8月14日题目精讲 [SCOI2010]游戏

    来源:牛客网: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld 题目描述 lxhgww最近迷上了一款 ...

  4. 【每日一题】8月28日题目精讲 编号

    [每日一题]8月28日题目精讲 编号 链接:https://ac.nowcoder.com/acm/problem/19925 来源:牛客网 题目描述 你需要给一批商品编号,其中每个编号都是一个7位1 ...

  5. 【每日一题】7月17日题目精讲—BOWL 碗的叠放

    [每日一题]7月17日题目精讲-BOWL 碗的叠放 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: %lld ...

  6. 【每日一题】7月15日题目精讲—生日快乐

    [每日一题]7月15日题目精讲-生日快乐 [SCOI2009]生日快乐 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO For ...

  7. 【每日一题】7月13日题目精讲—Kingdom

    [每日一题]7月13日题目精讲-Kingdom 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 1048576K,其他语言2097152K 64bi ...

  8. 【牛客每日一题】tokitsukaze and Soldier 题目精讲 贪心、优先队列、堆

    链接:https://ac.nowcoder.com/acm/problem/50439 来源:牛客网 ACM在线模板 今天才发现牛客推出了一个每日一题的版块,3月25号就开始了,今天才发现,赶紧补救 ...

  9. 【每日一题】5月7日题目精讲 「火」皇家烈焰

    链接: 「火」皇家烈焰 文章目录 题目描述 题解: 代码: 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524288K 64bit IO Format: % ...

最新文章

  1. Spring @Autowired和@Resource
  2. pr扫光转场插件_2020年最新pr转场特效:300套模板+200集视频教程+插件,送你参考...
  3. qfiledialog的取消_QT对话框去掉帮助和关闭按钮
  4. php获取表单后如何保存到数据库中,php – 如何将数据从HTML表单保存到WordPress中的数据库表?...
  5. 机器学习是如何改善企业生产力的?(内附机器智能版图)
  6. MySQL带参数的存储过程小例子
  7. 「代码随想录」746. 使用最小花费爬楼梯【动态规划】力扣详解!
  8. JavaWeb:重定向(redirect)和转发(forward)的区别
  9. C# 大华相机图像采集
  10. word转pdf免费网站
  11. 江苏省2021年高考成绩查询入口,江苏省教育考试院2021年江苏高考成绩查询时间及系统入口【预计6月24日起查分】...
  12. 组件化与插件化的差别在哪里?醍醐灌顶!
  13. win7怎样更改桌面计算机图标,教您电脑如何更改桌面图标
  14. kudu作为mysql从机_kudu 知识点学习(一)
  15. kali2021 JDK配置与安装(独一无二的详细)
  16. 蜘蛛爬行网站日志说明
  17. matlab中函数的定义和使用
  18. c#连接西门子plc
  19. 【软件工程实践】Hive研究-Blog10
  20. 为什么无名管道只能用于具有亲缘关系的进程之间通信

热门文章

  1. 除了PS,还有它可以轻松实现图像处理!
  2. java跨平台的特性_【简答题】什么是跨平台特性?Java怎样实现跨平台特性?
  3. centos7 禁止ip访问_centos7.6版本限制某个IP访问指定端口
  4. pythonlive2d_Unity-Live2D资源载入
  5. mysql5.5 mysqli_php5.5.38增加mysqli扩展
  6. 在php中使用kind,KindEditor 4.x在PHP中的应用实例!
  7. PyTorch深度学习实践
  8. 查询在具有最小内存容量的所有PC中具有最快处理器的PC制造商 (20 分)(两种思路+详解)
  9. DFS和BFS总结和代码演示(详解)
  10. [MyBatisPlus]入门案例