这道题目可以说是一道非常好非常一颗赛艇的DP题了。

需要注意的是,其中情形3),字符串必然能完全转化为 N(str)形式,如果有N(str1)M(str2)等等另外样式,应该首先使用拼接形式对其进行划分。

那么,我们首先考虑写一个用来压缩情形3)下的字符串的函数zip():

 char str[];
int bit(int n)
{
int cnt=;
while(n>)
{
n/=;
cnt++;
}
return cnt;
}
int zip(int l,int r)
{
int len=r-l+;
bool flag;
if(len<=) return len;
for(int sec=;sec<len;sec++)//循环节长度
{
if(len%sec) continue;//不能完全转化为N(str)形式
flag=;
for(int p=;p<=sec;p++)//遍历循环节中的每个结点
{
char now=str[l+p-];
for(int i=l+sec;i<=r;i+=sec)//遍历每个循环节的头结点
{
if(str[i+p-]!=now)
{
flag=;
break;
}
}
if(!flag) break;
}
if(flag) return(bit(len/sec) + + sec);//如果字符串可以按这个循环节进行压缩
}
return len;
}

使用比较暴力的方法,并不难写,bit()函数返回一个数字是几位数。

既然有了zip()函数,那么就可以进一步考虑状态转移方程了,如下:

dp[i][j]  =  min(  j - i + 1  ,  dp[i][k] + dp[k+1][j]  ,  zip( i , j )  ); (即情形1) 2) 3)中选取最小的)

其中,dp[i][j]表示字符串str[i,j]的压缩后最短长度。

最后,我们考虑如何进行状态转移,联想到之前http://www.cnblogs.com/dilthey/p/6889141.html中的归并思路,

我们也可以对本题进行一定的归并,首先初始化所有dp[i][i]=1,然后,依次计算出j - i = 1,2,3,……,n-1的dp[i][j],

另外要注意的是,我们要对zip()函数做一点小修改,如果不修改的话,样例都过不了嗷

 #include<cstdio>
#include<cstring>
#include<algorithm>
#define INF 0x3f3f3f3f
using namespace std;
char str[];
int dp[][];
int bit(int n)
{
int cnt=;
while(n>)
{
n/=;
cnt++;
}
return cnt;
}
int zip(int l,int r)
{
int len=r-l+;
bool flag;
if(len<=) return len;
for(int sec=;sec<len;sec++)//循环节长度
{
if(len%sec) continue;//不能完全转化为N(str)形式
flag=;
for(int p=;p<=sec;p++)//遍历循环节中的每个结点
{
char now=str[l+p-];
for(int i=l+sec;i<=r;i+=sec)//遍历每个循环节的头结点
{
if(str[i+p-]!=now)
{
flag=;
break;
}
}
if(!flag) break;
}
if(flag) return(bit(len/sec) + + dp[l][l+sec-]);//如果字符串可以按这个循环节进行压缩
}
return len;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",str+);
int len=strlen(str+);
for(int i=;i<=len;i++) dp[i][i]=;
for(int l=;l<=len;l++)
{
for(int i=,j=i+l-;j<=len;i++,j=i+l-)
{
int tmp=INF;
for(int k=i;k<j;k++) if(tmp>dp[i][k]+dp[k+][j]) tmp=dp[i][k]+dp[k+][j];
dp[i][j]=min( min(l,tmp) ,zip(i,j) );
}
}
printf("%d\n",dp[][len]);
}
}

当然,这不是一种很优化的算法,时间复杂度大概在O(len^3),可以考虑进行一定的优化。不过反正我是想不出

hihocoder 1320 - 压缩字符串 - [hiho一下160周]的更多相关文章

  1. hihoCoder #1320 : 压缩字符串 区间dp

    /** 题目:hihoCoder #1320 : 压缩字符串 链接:https://hihocoder.com/problemset/problem/1320 描述 小Hi希望压缩一个只包含大写字母' ...

  2. hihocoder 1320 压缩字符串(字符串+dp)

    题解: 其实就是对应三种dp的转移方式 1.拼接类型 dp[i][j] = dp[i][c] + dp[c][j] 2.不变类型 dp[i][j] = j-i+1 3.重复类型(必须满足有k个循环节) ...

  3. hihocoder 1323 - 回文字符串 - [hiho一下162周][区间dp]

    用dp[i][j]表示把[i,j]的字符串str改写成回文串需要的最小操作步数. 并且假设所有dp[ii][jj] (ii>i , jj<j)都为已知,即包括dp[i+1][j].dp[i ...

  4. hihocoder 1829 - 压缩字符串 - [状压+暴力枚举][2018ICPC北京网络预赛B题]

    题目链接:https://hihocoder.com/problemset/problem/1829 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, ...

  5. hihocoder 1331 - 扩展二进制数 - [hiho一下168周]

    题目链接:http://hihocoder.com/problemset/problem/1331 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 我们都知道二进制数的每 ...

  6. hihocoder 1330 - 数组重排 - [hiho一下167周][最小公倍数]

    题目链接:https://hihocoder.com/problemset/problem/1330 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi想知道,如果他 ...

  7. hihocoder 1322 - 树结构判定 - [hiho一下161周][模板题/水题]

    题目链接:http://hihocoder.com/problemset/problem/1322 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个包含 N 个顶 ...

  8. C#压缩字符串

    在论坛上看到一个压缩字符串的问题,特此记录以备后用! static string GetStringR(string inputStr) { return Regex.Replace(inputStr ...

  9. [LeetCode] Design Compressed String Iterator 设计压缩字符串的迭代器

    Design and implement a data structure for a compressed string iterator. It should support the follow ...

随机推荐

  1. VMWare------安装时出现无法将值写入注册表项

    安装时提示详情: 无法打开注册表项UNKNOWN\Components\...请确认你是否有足够的权限访问该注册表项,或者与技术支持人员联系. 解决方法: 关掉360安全卫士等软件再安装

  2. 【Oracle】BLOB

    1.データベースからの読み込み Dim strSql As String = "select IMG from TBL where ID=XX" Dim cmd As New Or ...

  3. AppStore应用转让流程

    可能大家都有这样的情况,给公司客户开发一个ios app的前期阶段是先发布在自己公司的开发者账户上面的,而不是直接发布在客户的开发者账号上面,这个到后期的话就有一个转让的事情,俗称“过户”. 步骤如下 ...

  4. Activiti 5.1.4最佳实践

    1.简单介绍 Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度. Activiti 作为一个遵从 Apache 许可的工作流和业 ...

  5. matlab矩阵内存预分配

    matlab矩阵内存预分配就意味着,划定一个固定的内存块,各数据可直接按"行.列指数"存放到对应的元素中.若矩阵中不预配置内存.则随着"行.列指数"的变大.MA ...

  6. 8 -- 深入使用Spring -- 2...5 Spring 3.0 新增的注解

    8.2.5 Spring 3.0 新增的注解 @DependsOn @Lazy @DependsOn :用于强制初始化其他Bean.修饰Bean类或方法,可以指定一个字符串数组作为参数,每个数组元素对 ...

  7. Linux curl 命令下载文件

    引用自http://blog.csdn.net/wh211212/article/details/54285921 命令:curl 在Linux中curl是一个利用URL规则在命令行下工作的文件传输工 ...

  8. Maven update project...后jdk变成1.5,update project后jdk版本改变

    Maven update project...后jdk变成1.5,update project后jdk版本改变 ============================== 蕃薯耀 2018年3月14 ...

  9. GC--垃圾收集器

    把周末的文章放在现在才来写,是自己太忙了?还是堕落了? 好吧直接进入主题吧,简单干脆的理解会让自己记忆深刻: 首先说明:GC垃圾收集器关注两件事情: 第一件:查找所有存活对象. 第二件:抛弃死对象(不 ...

  10. Java 数据库访问层

    最近项目中需要对mysql进行操作,数据库的知识早在本科毕业那会就忘光了,这几年开发都没接触到数据库的操作. 借这个机会重新学习,数据库访问层是对数据库操作的一个封装,屏蔽底层的数据操作细节,通过使用 ...