hihocoder 1320 - 压缩字符串 - [hiho一下160周]
这道题目可以说是一道非常好非常一颗赛艇的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周]的更多相关文章
- hihoCoder #1320 : 压缩字符串 区间dp
/** 题目:hihoCoder #1320 : 压缩字符串 链接:https://hihocoder.com/problemset/problem/1320 描述 小Hi希望压缩一个只包含大写字母' ...
- hihocoder 1320 压缩字符串(字符串+dp)
题解: 其实就是对应三种dp的转移方式 1.拼接类型 dp[i][j] = dp[i][c] + dp[c][j] 2.不变类型 dp[i][j] = j-i+1 3.重复类型(必须满足有k个循环节) ...
- hihocoder 1323 - 回文字符串 - [hiho一下162周][区间dp]
用dp[i][j]表示把[i,j]的字符串str改写成回文串需要的最小操作步数. 并且假设所有dp[ii][jj] (ii>i , jj<j)都为已知,即包括dp[i+1][j].dp[i ...
- hihocoder 1829 - 压缩字符串 - [状压+暴力枚举][2018ICPC北京网络预赛B题]
题目链接:https://hihocoder.com/problemset/problem/1829 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 Lara Croft, ...
- hihocoder 1331 - 扩展二进制数 - [hiho一下168周]
题目链接:http://hihocoder.com/problemset/problem/1331 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 我们都知道二进制数的每 ...
- hihocoder 1330 - 数组重排 - [hiho一下167周][最小公倍数]
题目链接:https://hihocoder.com/problemset/problem/1330 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi想知道,如果他 ...
- hihocoder 1322 - 树结构判定 - [hiho一下161周][模板题/水题]
题目链接:http://hihocoder.com/problemset/problem/1322 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个包含 N 个顶 ...
- C#压缩字符串
在论坛上看到一个压缩字符串的问题,特此记录以备后用! static string GetStringR(string inputStr) { return Regex.Replace(inputStr ...
- [LeetCode] Design Compressed String Iterator 设计压缩字符串的迭代器
Design and implement a data structure for a compressed string iterator. It should support the follow ...
随机推荐
- iOS6 中 Smart App Banners介绍和使用(转自COCOACHINA.COM)
转自:http://www.cocoachina.com/applenews/devnews/2012/0924/4842.html iOS 6新增Smart App Banners,也就是“智能Ap ...
- PHP基本连接数据库
最简单的代码 connect.php <?php $host="localhost"; $db_user="root"; $db_pass="& ...
- Redis 操作字符串数据
Redis 操作字符串数据: > set name "Tom" // set 用于添加 key/value 数据,如果 key 存在则覆盖 OK > setnx nam ...
- Unity使用OpenGL绘制经纬线圈
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LatLonGr ...
- CentOS7--配置时间和日期
CentOS7提供三个命令行工具,可用于配置和显示有关系统日期和时间的信息. timedatectl:Linux 7中的新增功能,也是systemd其中的一部分. date:系统时钟,也成为软件时钟, ...
- codeforces水题100道 第七题 Codeforces Round #270 A. Design Tutorial: Learn from Math (math)
题目链接:http://www.codeforces.com/problemset/problem/472/A题意:给你一个数n,将n表示为两个合数(即非素数)的和.C++代码: #include & ...
- Struts2(二)工作原理
一.概述 1.struts框架本身分为三个部分:核心控制器FilterDispatcher.业务控制器Action和用户实现的企业业务逻辑组件. 2.struts2工作的基本流程: 客户端初始化一个指 ...
- C语言EOF是什么?
C语言 EOF是什么? Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出"标准输入"的缓存区,所以这时必须按两次Ctrl ...
- C# 压缩 SharpZipLib
zip压缩与解压缩: 官方网站:http://icsharpcode.github.io/SharpZipLib/ 官网下载的资源并不是能够直接运行的,感觉是这个dll的编译,开源的 参考文档:htt ...
- 在PowerDesigner中自动生成sqlserver字段备注
在PowerDesigner中自动生成sqlserver字段备注 PowerDesigner是数据库设计人员常用的设计工具,但其自生默认生成的代码并不会生成sqlserver数据库的字段备注说明.在生 ...