这道题目可以说是一道非常好非常一颗赛艇的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. easyui datagrid 单元格编辑(cell editing)

    demo中有row editing 项目中发现个cell editing,但是有bug,修改好了 主要实现功能:单击数据表格单元格,编辑单元格数据 js代码如下: $.extend($.fn.data ...

  2. 随笔 -- NIO -- 相关 -- 系统概述

    .打开Selector .打开ServerSocketChannel .获取与此Channel关联的ServerSocket并绑定地址 .设置Channel为非阻塞 .将Channel注册到Selec ...

  3. (转)base64编码是怎么工作的?

    按:在PHP中级班的课堂上,有位同学问这样一个问题:“我在用 base64_encode 对用户名进行编码时,会出来等号,是不是可以去掉?”跟我来看完这篇文章,答案即揭晓. 1: 为什么需要base6 ...

  4. win7+ oracle +php环境的搭建

    http://blog.csdn.net/chchmlml/article/details/6887326 先下载个wmpp1.7.5(之前在xp上也是这个,所以就继续),安装,一切顺利,打开phpi ...

  5. 采用get方式提交数据到服务器实例

    GetDemo项目目录 一.编写StreamTools.java /** * */ package com.hyzhou.getdemo.utiils; import java.io.ByteArra ...

  6. Linux应急响应入侵排查思路

    0x00 前言 ​ 当企业发生黑客入侵.系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故过程,同时给出解 ...

  7. iOS开发-iOS7禁用手势返回

    - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; // 禁用 iOS7 返回手势 if ([self.nav ...

  8. Selenium 基本用法

    如下,使用 Selenium 打开淘宝首页并获取页面源代码: from selenium import webdriver browser = webdriver.Chrome() # 声明一个浏览器 ...

  9. 系统日志:/var/log/messages

    /var/log/messages 存放的是系统的日志信息,它记录了各种事件,基本上什么应用都能往里写日志,在做故障诊断时可以首先查看该文件内容 [root@mirh5_center1_111.231 ...

  10. LeetCode-394. Decode String(DFS)

    Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...