博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ 1068] [SCOI2007] 压缩 【记忆化搜索】
阅读量:5263 次
发布时间:2019-06-14

本文共 1152 字,大约阅读时间需要 3 分钟。

题目链接:

 

题目分析

这种记忆化搜索(区间 DP) 之前就做过类似的,也是字符串压缩问题,不过这道题稍微复杂一些。

需要注意如果某一段是 S1S1 重复,那么可以变成 M + Solve(S1) + R ,不过这个 Solve(S1) 中不能在中间有 M ,否则后面的 R 向前找到的 M 就不再是开头的 M 了。

 

代码

#include 
#include
#include
#include
#include
#include
using namespace std;const int MaxL = 50 + 5;int l, Ans;int g[MaxL][MaxL][3];char S[MaxL];bool Check(int l, int r) { if ((r - l + 1) & 1) return false; int mid = (l + r) >> 1, t = (r - l + 1) >> 1; for (int i = l; i <= mid; ++i) if (S[i] != S[i + t]) return false; return true;}int Solve(int l, int r, int f) { if (g[l][r][f] > 0) return g[l][r][f]; int ret = r - l + 1, t; if (Check(l, r)) { t = Solve(l, l + ((r - l) / 2), 2); ++t; //R if (f == 0) ++t; //M if (ret > t) ret = t; } for (int i = l; i <= r - 1; ++i) { if (f != 2) t = Solve(l, i, f) + Solve(i + 1, r, 0); else t = Solve(l, i, 2) + (r - i); if (ret > t) ret = t; } g[l][r][f] = ret; return ret;}int main() { scanf("%s", S + 1); l = strlen(S + 1); Ans = Solve(1, l, 1); printf("%d\n", Ans); return 0;}

  

转载于:https://www.cnblogs.com/JoeFan/p/4263614.html

你可能感兴趣的文章
【雷电】源代码分析(二)-- 进入游戏攻击
查看>>
Entityframework:“System.Data.Entity.Internal.AppConfig”的类型初始值设定项引发异常。...
查看>>
Linux中防火墙centos
查看>>
mysql新建用户,用户授权,删除用户,修改密码
查看>>
FancyCoverFlow
查看>>
JS博客
查看>>
如何设置映射网络驱动器的具体步骤和方法
查看>>
ASP.NET WebApi 基于OAuth2.0实现Token签名认证
查看>>
283. Move Zeroes把零放在最后面
查看>>
Visual Studio Code 打开.py代码报Linter pylint is not installed解决办法
查看>>
Python 数据类型
查看>>
S5PV210根文件系统的制作(一)
查看>>
centos下同时启动多个tomcat
查看>>
slab分配器
查看>>
数据清洗
查看>>
【读书笔记】C#高级编程 第三章 对象和类型
查看>>
针对sl的ICSharpCode.SharpZipLib,只保留zip,gzip的流压缩、解压缩功能
查看>>
【转】代码中特殊的注释技术——TODO、FIXME和XXX的用处
查看>>
【SVM】libsvm-python
查看>>
Jmeter接口压力测试,Java.net.BindException: Address already in use: connect
查看>>