题目传送门

字符串折叠

题目描述

折叠的定义如下:

  1. 一个字符串可以看成它自身的折叠。记作S = S
  2. X(S)是X(X>1)个S连接在一起的串的折叠。记作X(S) = SSSS…S(X个S)。
  3. 如果A = A’, B = B’,则AB = A’B’ 例如,因为3(A) = AAA, 2(B) = BB,所以3(A)C2(B) = AAACBB,而2(3(A)C)2(B) = AAACAAACBB

    给一个字符串,求它的最短折叠。例如AAAAAAAAAABABABCCD的最短折叠为:9(A)3(AB)CCD。

输入输出格式

输入格式:

仅一行,即字符串S,长度保证不超过100。

输出格式:

仅一行,即最短的折叠长度。

输入输出样例

输入样例#1: 复制

NEERCYESYESYESNEERCYESYESYES
输出样例#1: 复制

14

说明

一个最短的折叠为:2(NEERC3(YES))


  分析:

  K_lord的考试里面出的题目。考的时候直接弃疗。。。(先膜一波老余AK%%%)

  需要用区间DP来做,首先定义动规数组f[l][r],表示从l到r这一段区间内的字符串折叠后能得到的最短结果。那么枚举折叠的区间,然后枚举左右区间,再枚举可折叠的长度,也就是枚举区间长度的所有因数,然后进行判断该区间是否可以折叠,如果可以则进行状态转移。值得注意的是,转移完以后还需要在进行依次断点枚举,表示将该区间分成两次折叠,看能否得到最短折叠。当然,蒟蒻不擅长动规,还是听了老余讲课,又参考了大佬的博客才弄懂的。如果上面的思路不太懂,就直接看代码吧,代码好懂多了。

  Code:

#include<bits/stdc++.h>
using namespace std;
char s[];int f[][];
inline bool check(int l,int r,int k)
{
for(int i=l+k,p=;i<=r;i++,p=(p+)%k)
if(s[i]!=s[l+p])return false;
return true;
}
inline int get(int x)
{int ret=;while(x)x/=,ret++;return ret;}
int main()
{
memset(f,0x7f,sizeof(f));
scanf("%s",s+);int n=strlen(s+);
for(int i=;i<=n;i++)f[i][i]=;
for(int i=;i<=n;i++)
for(int l=;l+i-<=n;l++){
int r=l+i-;
for(int k=;k*k<=i;k++){
if(i%k==){
if(check(l,r,i/k))f[l][r]=min(f[l][r],f[l][l+i/k-]+get(k));
if(check(l,r,k))f[l][r]=min(f[l][r],f[l][l+k-]+get(i/k));}}
for(int k=l;k<=r;k++)
f[l][r]=min(f[l][r],f[l][k]+f[k+][r]);}
printf("%d",f[][n]);return ;
}

最新文章

  1. ios cell时间相同隐藏算法
  2. Gradle基础
  3. ASMCMD命令
  4. 用soapUI生成客户端代码
  5. PHP实现 bitmap 位图排序 求交集
  6. iOS6:在你的App内使用Passbook
  7. 微价值:专訪《甜心爱消除》个人开发人员Lee,日入千元!
  8. 扒一扒各大电商网站的m站都用的什么前端技术输入日志标题
  9. Git教程(5)常用技巧之本地分支
  10. java枚举类型enum的使用
  11. nginx lua 开发笔记
  12. 上传jar包到nexus私服
  13. VelocityTracker简单介绍
  14. UNIX网络编程---简介
  15. 获取调用者Class和method、反射获取get方法、获取注解信息
  16. 如何破解Excel VBA密码
  17. windows 检测进程pid
  18. JS 全屏代码
  19. nodeJs 资料
  20. Pushlets 配置参数详解

热门文章

  1. angularJs $resource自定义方法(待完善)
  2. linux时区修定转
  3. RabbitMQ与Spring集成
  4. windows10安装oracle11g报错ORA-01034、ORA-01078
  5. 小程序_改变switch组件的大小
  6. perl6 修改文件并覆盖
  7. KVM虚拟机建立快照
  8. glom模块的使用(一)
  9. 关于aspxgridview里面过长内容只显示的一部分的处理方案
  10. HDU 3480 Division(斜率DP裸题)