[SCOI2007]压缩

状态:设\(dp[i][j]\)表示前i个字符,最后一个\(M\)放置在\(j\)位置之后的最短字串长度.

转移有三类,用刷表法来实现.

第一种是直接往压缩串后面填字符,这样就是:

\[dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1)
\]

另外一种就是往字串里添加\(R\),要满足相邻两个字符串是匹配的,可以用字符串哈希来快速匹,另外下面的\(k\)和\(sz\)要倍增往后跳(因为重复的串长在成倍增加,题目的样例解释的很清楚了).

\[dp[k][j]=min(dp[k][j],dp[k-sz][j]+1)
\]

当然还要往后填\(M\)

\[dp[i][i]=min(dp[i][i],dp[i][j])
\]

时间复杂度\(O(n^2logn)\)

代码很好懂.

#include<bits/stdc++.h>
#define ull unsigned long long
#define maxn 55
using namespace std;
const int base=233;
ull ha[maxn],pw[maxn];
char s[maxn];
int n,ans,dp[maxn][maxn];
ull gethash(int l,int r){return ha[r]-ha[l-1]*pw[r-l+1];}
int main()
{
scanf("%s",s+1);n=strlen(s+1);pw[0]=1;
for(int i=1;i<=n;i++)ha[i]=ha[i-1]*base+s[i];
for(int i=1;i<=n;i++)pw[i]=pw[i-1]*base;
memset(dp,0x3f,sizeof(dp));dp[1][0]=1;
//dp[i][j]表示前i个字符,上一个M放在j位置之后的最短加密字串
for(int i=1;i<=n;i++)
{
for(int j=0;j<i;j++)dp[i][i]=min(dp[i][i],dp[i][j]+1);
for(int j=0;j<=i;j++)
{
dp[i+1][j]=min(dp[i+1][j],dp[i][j]+1);//往后直接添加字母
if(i==j)continue;
int sz=i-j;ull haha=gethash(j+1,i);
for(int k=i+sz;k<=n;k+=sz)//倍增加R
{
if(haha==gethash(k-sz+1,k))//哈希匹配字符串
dp[k][j]=min(dp[k][j],dp[k-sz][j]+1);
else break;
haha=haha*pw[sz]+haha;sz<<=1;
}
}
}
ans=1e9;
for(int j=0;j<n;j++)ans=min(ans,dp[n][j]);
cout<<ans<<endl;
return 0;
}

最新文章

  1. 解决方法of未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
  2. PHP与Javascript的混合测试
  3. C# \uxxx Unicode编码解码
  4. Drawer Layout
  5. Java中的栈上分配
  6. Servlet3.0上传图片示例
  7. PHP MySQL 简介
  8. HDU - 5833: Zhu and 772002 (高斯消元-自由元)
  9. html-edm(邮件营销)编写规则
  10. 单片机的外围功能电路 LET′S TRY“嵌入式编程”: 2 of 6
  11. vue.js----之router详解(一)
  12. Vue 目录结构 绑定数据 绑定属性 循环渲染数据
  13. python day16--面向对象(01)
  14. 关闭或开启memory_target
  15. HEAD插件安装
  16. Python读文件报错:SyntaxError: Non-ASCII character in file
  17. Delphi获取文件名、文件名不带扩展名、文件名的方法;delphi 获取文件所在路径
  18. 【LESS系列】高级特性
  19. 浅谈JS异步轮询和单线程机制
  20. 剑指 Offer——和为 S 的连续正数序列

热门文章

  1. EasyDL的哪种算法更适合你的图像分类应用
  2. Python-入门学习
  3. France beat Croatia 4-2 in World Cup final
  4. python 2.7 - 3.5 升级之路 (一) : 准备阶段开发环境 -- pip3, vitualEnv, pycharm
  5. Excel催化剂开源第5波-任务窗格在OFFICE2013中新建文档不能同步显示问题解决
  6. YOLO V1损失函数理解
  7. jmeter使用问题——将接口返回变量存储成csv文件
  8. 《VR入门系列教程》之16---第一个OculusVR应用
  9. Java_Map接口
  10. 给定一个IP地址,转化为二进制32位,再转化为十进制,写出一个方法让其十进制转为IP地址