和Luogu 4302 [SCOI2003]字符串折叠 差不多的想法,区间dp

为了计算方便,我们可以假设区间[l, r]的前面放了一个M,设$f_{i, j, 0/1}$表示区间$[i, j]$中是否存在M

因为这题只能是二的幂次倍压缩,所以转移的时候枚举中点chk是否合法,如果合法那么

  $f_{i, j, 0} = f_{i, (i + j) / 2 - 1, 0} + 1$

除了区间压缩,还可以通过加法构成最优答案

1、当中间加入了M,枚举M加入的位置 $f_{i, j, 1} = min(min(f_{i, k, 1}, f_{i, k, 0}) + min(f_{k + 1, r, 0}, f_{k + 1, r, 1}) + 1)$  $(i - 1 <k < j)$

2、当中间没有M的时候,相当于后面的子串不存在压缩

    $f_{i, j, 1} = min(f_{i, k, 0} + j - k)$ $(i - 1 < k < j)$

时间复杂度为不严格的$O(n^{3})$(只是一个上界?)

Code:

#include <cstdio>
#include <cstring>
using namespace std;const int N = 55;int n, f[N][N][2];
char s[N];inline int min(int x, int y) {return x > y ? y : x;
}inline void chkMin(int &x, int y) {if(y < x) x = y;
}inline bool chk(int l, int r) {int len = (r - l + 1) / 2;for(int i = l; i <= r - len; i++)if(s[i] != s[i + len]) return 0;return 1;
}int main() {
//    freopen("3.in", "r", stdin);
    scanf("%s", s + 1);n = strlen(s + 1);memset(f, 0x3f, sizeof(f));for(int len = 1; len <= n; len++) {for(int l = 1; l + len - 1 <= n; l++) {int r = l + len - 1;chkMin(f[l][r][0], len), chkMin(f[l][r][1], len);if(len % 2 == 0 && chk(l, r)) chkMin(f[l][r][0], 1 + f[l][l + len / 2 - 1][0]);for(int k = l; k < r; k++) {chkMin(f[l][r][1], min(f[l][k][0], f[l][k][1]) + 1 + min(f[k + 1][r][1], f[k + 1][r][0]));chkMin(f[l][r][0], f[l][k][0] + r - k);}}}printf("%d\n", min(f[1][n][0], f[1][n][1]));return 0;
}

View Code

转载于:https://www.cnblogs.com/CzxingcHen/p/9484311.html

Luogu 2470 [SCOI2007]压缩相关推荐

  1. luogu P2470 [SCOI2007]压缩

    传送门 dalao们怎么状态都设的两维以上啊?qwq 完全可以一维状态的说 设\(f[i]\)为前缀i的答案,转移就枚举从前面哪里转移过来\(f[i]=min(f[j-1]+w(j,i))(j\in ...

  2. BZOJ 1068: [SCOI2007]压缩

    1068: [SCOI2007]压缩 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 1493  Solved: 941 [Submit][Status ...

  3. luogu P2053 [SCOI2007]修车(费用流提前计算)

    P2053 [SCOI2007]修车 要求平均时间最短,就等同于要求总时间最短. 一个人维修所花的时间,对同一位技术人员之后维修造成的影响是已知且固定的.那么,我们将费用提前计算.即将第 i 位车主的 ...

  4. BZOJ1068:[SCOI2007]压缩——题解

    http://www.lydsy.com/JudgeOnline/problem.php?id=1068 Description 给一个由小写字母组成的字符串,我们可以用一种简单的方法来压缩其中的重复 ...

  5. luogu P2053 [SCOI2007]修车

    P2053 [SCOI2007]修车 题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术 ...

  6. [BZOJ1068/Luogu2470][SCOI2007]压缩

    题目链接: BZOJ1068 Luogu2470 区间\(DP\). 设\(f_{[l][r]}\)? 但是转移时如果加一个\(R\)则无法知道上一个\(M\)在什么地方. 所以设\(f_{[l][r ...

  7. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  8. 2019.4.summary

    2019.4.1 BZOJ1061: [Noi2008]志愿者招募 真心有点难QAQ https://www.byvoid.com/zhs/blog/noi-2008-employee 看void爷的 ...

  9. OI 刷题记录——每周更新

    每周日更新 2016.05.29 UVa中国麻将(Chinese Mahjong,Uva 11210) UVa新汉诺塔问题(A Different Task,Uva 10795) NOIP2012同余 ...

最新文章

  1. 井下关于风速的规定_【市企融合】金川集团井下“5G+矿运卡车”远程遥控系统科研项目实验成功...
  2. pandas使用pd.concat纵向合并多个dataframe实战:多个dataframe的纵向合并、为纵向合并的多个dataframe设置标识符指定数据来源
  3. Android 学习笔记--android——AsyncTask在Android4.X的机制问题
  4. Node.js 系列:构建原生 Node.js 应用
  5. 为预防软件质缺陷应该做点儿什么
  6. Java接口修饰符详解
  7. 方差分析中的“元”和“因素”是什么?
  8. 22解析函数的级数表示(一)
  9. 增强型的for循环linkedlist_38. 为什么千万别用for循环迭代LinkedList
  10. python 转成摩尔斯电码_【无线电史话】比莫尔斯电码更直观 | 1919年的护林员通过Myer码传递信息...
  11. 盘点五款好用的项目管理软件
  12. 哔哩哔哩电脑版下载后音频与画面分离,视频没有声音
  13. Python入门学习二:列表
  14. html 标签的语义化
  15. 单片机概述习题以及答案
  16. Springboot期刊在线投稿系统74j50计算机毕业设计-课程设计-期末作业-毕设程序代做
  17. 保险经纪人是什么鬼?
  18. 圆桌实录:技术无感化成为 2023 年最值得开发者和企业用户关注的技术趋势丨PingCAP DevCon 2022
  19. 计算机开启U盘,U盘在电脑上打不开,我们要怎么做?
  20. 世界区块链大会,ZJUBCA再出发

热门文章

  1. 几则与西门子相关的消息
  2. matlab生成多组多维高斯分布数据
  3. C语言程序设计最佳分组,求助把一些数值按指定的和进行分组
  4. 码云nacos下载_nacos安装,配置以及持久化
  5. linux cp 目录不存在自动创建,关于linux:Linux技巧cp命令自动创建不存在的目录和只复制修改的文件...
  6. sign函数的功能oracle,Oracle中sign函数和decode函数的使用
  7. android studio dump java heap_Android Studio 3.0 Memory Profiler使用
  8. python3 正则表达式 嵌套表格_在Python中使用正则表达式匹配嵌套结构
  9. linux系统桌面缺色,红旗系统如何用?
  10. Ubuntu解决开机屏幕默认亮度偏低问题