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 ...
随机推荐
- Hibernate_day01讲义_使用Hibernate完成对CRM系统中客户管理的DAO中的CRUD的操作
- NetBpm 配置篇(2)
转载注明出处:http://www.cnblogs.com/anbylau2130/p/3877353.html 上一篇中介绍了Netbpm在IIS和CassiniWebServer服务器的安装 通过 ...
- VS2013 未找到與約束ContractName...
windows 2008 r2 上面裝的VS2013, 在某一天系統更新之後,再次打開VS項目的時候就出現了上面那個問題 解決方法,打開控制面板,找到下面這個程序,右擊,修復即可
- Winform判断EventHandler是否已经添加
斜体部分替换成自己需要的 private bool HasValueChangedEventHandler(DateTimePicker b) { FieldInfo f1 = typeof(Date ...
- UITextField in a UITableViewCell
http://stackoverflow.com/questions/409259/having-a-uitextfield-in-a-uitableviewcell http://stackover ...
- 存储过程中SELECT INTO的使用
在MySQL存储过程中使用SELECT …INTO语句为变量赋值: 用来将查询返回的一行的各个列值保存到局部变量中. 要求: 查询的结果集中只能有1行. SELECT col_name[,...] I ...
- Python "HTTP Error 403: Forbidden"
问题: 执行下面的语句时 def set_IPlsit(): url = 'https://www.whatismyip.com/' response = urllib.request.urlopen ...
- 网站前端性能优化之javascript和css
之前看过Yahoo团队写的一篇关于网站性能优化的文章,文章是2010年左右写的,虽然有点老,但是很多方面还是很有借鉴意义的.关于css的性能优化,他提到了如下几点: CSS性能优化 1.把样式表置于顶 ...
- TOMCAT可以稳定支持的最大并发用户数
转自:http://blog.sina.com.cn/s/blog_68b7d2f50101ann7.html 服务器配置: 单硬盘,SATA 8MB缓存 测试服务器和loadrunner运行服务 ...
- C++ template —— 智能指针(十二)
在管理动态分配的内存时,一个最棘手的问题就是决定何时释放这些内存,而智能指针就是用来简化内存管理的编程方式.智能指针一般有独占和共享两种所有权模型.-------------------------- ...