https://vjudge.net/problem/UVA-1630

题意:

给出一个由大写字母组成的长度为n的串,折叠成一个尽量短的串。例如:AAAAAAAAABABABCCD折叠成9(A)3(AB)CCD。

思路:

参考自http://blog.csdn.net/a197p/article/details/48701227。自己实在是没什么思路,也是看了很久才搞明白。

DP[i][j]表示的是 i~j 压缩后的长度。

fold[i][j]存储 i~j 压缩后的状态。

 #include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std; const int INF = 0x3f3f3f3f;
string str;
int DP[][];
string fold[][]; int judge(int l, int r)
{
//这里判重用的就是枚举
for (int i = ; i <= (r - l + ) / ; i++)
{
if ((r - l + ) % i) continue;
bool flag = true;
for (int j = l; j + i <= r; j++)
{
if (str[j] != str[j + i])
{
flag = false;
break;
}
}
if (flag) return i;
}
return false;
} int fun(int l, int r)
{
if (DP[l][r] != -) return DP[l][r]; if (l == r)
{
DP[l][r] = ;
fold[l][r] = str[l];
return ;
}
int k;
int re = INF;
//找到一个k,两段折叠后连接达到最短
for (int i = l; i < r; i++)
{
int tmp = fun(l, i) + fun(i + , r);
if (tmp < re) { k = i; re = tmp; }
}
fold[l][r] = fold[l][k] + fold[k + ][r];
int len = judge(l, r);
//对重复串的压缩
if (len)
{
bool test = true;
for (int i = l; i <= r; i++)
{
if (str[i] == '(' || str[i] == ')') test = false; //不要把括号作为压缩对象
}
char t[];
sprintf(t, "%d", (r - l + ) / len);
string newstr = t + string("(") + fold[l][l + len - ] + string(")");
if (test && newstr.size()<re)
{
re = newstr.size();
fold[l][r] = newstr;
}
}
DP[l][r] = re;
return re;
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
while (cin >> str)
{
int R = str.size() - ;
memset(DP, -, sizeof(DP));
fun(, R);
cout << fold[][R] << endl;
}
return ;
}

UVa 1630 串折叠的更多相关文章

  1. Uva 1630 折叠串

    题目链接:https://uva.onlinejudge.org/external/16/1630.pdf 题意:折叠串,给一个字符串,相同部分可以折叠,折叠可以嵌套.求最短长度的一种折叠方法.括号和 ...

  2. UVA - 1630 Folding(串折叠)(dp---记忆化搜索)

    题意:给出一个由大写字母组成的长度为n(1<=n<=100)的串,“折叠”成一个尽量短的串.折叠可以嵌套.多解时可输出任意解. 分析: 1.dp[l][r]为l~r区间可折叠成的最短串的长 ...

  3. 习题9-4 uva 1630

    题意: 给你一串数字,要求你对其进行折叠使其长度最短. 折叠情况:全是一个字母 & 重复的字符串 AAAAAAAAAABABABCCD    -->   9(A)3(AB)CCD NEE ...

  4. Folding UVA - 1630

    题目 ans[i][j]表示由原串第i个字符到第j个字符组成的子串的最短折叠长度如果从i到j本身可以折叠,长度就是本身长度或折叠后的长度的最小值***此处参考:http://blog.csdn.net ...

  5. UVa 1630 Folding (区间DP)

    题意:折叠一个字符串,使得其成为一个尽量短的字符串  例如AAAAAA变成6(A) 而且这个折叠是可以嵌套的,例如 NEEEEERYESYESYESNEEEEERYESYESYES 会变成 2(N5( ...

  6. UVa 1630 区间DP Folding

    一个字符串如果能简写,要么是重复多次,按题中的要求简写:要么是左右两个部分分别简写后再拼起来. dp(i, j)表示字串(i, j)所能被简写的最短的字符串. 判断一个字符串是否为周期串以及求出它的周 ...

  7. 【Uva 1630】Folding

    [Link]: [Description] 你能对字符串进行压缩的操作; 即把连续出现的相同的子串改成它出现的次数+这个最基本的字符串的形式; 问你这个字符串最短能被压缩得多短; [Solution] ...

  8. P4302 [SCOI2003]字符串折叠

    题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS…S(X个S). 如果A = A’, B = ...

  9. Vim 神器的打造方式

    Vim 神器的打造方式     [字体:大 中 小]   Vim 是一个上古神器,本篇文章主要持续总结使用 Vim 的过程中不得不了解的一些指令和注意事项,以及持续分享一个前端工作者不得不安装的一些插 ...

随机推荐

  1. Py中的多维数组ndarray学习【转载】

    转自:http://blog.sciencenet.cn/home.php?mod=space&uid=3031432&do=blog&id=1064033 1. NumPy中 ...

  2. 7.4 Models -- Pushing Records into the Store

    一.概述 1. store是作为一个所有records的缓存,这些records已经被你的应用程序加载.在你的app中如果你的路由或者一个controller请求一条record,如果它在缓存中这个s ...

  3. 9/24matplotlib使用入门

    ---恢复内容开始--- matplotlib的使用中有好几种输出风格,有matlab风格,和官方文档的as风格,各有所长,本文对比介绍官方文档中的使用风格. 我们画图的目的是要将函数以图像显示出来, ...

  4. Docker深入浅出3-容器管理

    docker客户端非常简单,我们可以直接输入docker命令来查看Docker客户端所有的命令项 [root@admin-fxr ~]# docker Usage: docker COMMAND A ...

  5. Redis 十分钟快速入门

    本教程是一个快速入门教程,所以Redis的命令只是简单介绍了几个常用的,如果有其他需求请求官网查看API 使用. 1. Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的ke ...

  6. 借root之名,行流氓之实,劝告,root需谨慎

    20160425++++++ 今日再回头看这篇文章,貌似有点偏激了一点,不过xda论坛上有个疑似kingroot开发团队的用户说明了kingroot确实对supersu做了限制,说是supersu在替 ...

  7. keras load model 遇到 自定义函数 Lambda(lambda x: softmax(x, axis=1), NameError: global name 'softmax' is not defined

    问题 在定义模型的时候,自定义了一个函数 模型保存之后,load 模型的时候报错: 解决 load 模型的时候需要指定custom object 参考: https://faroit.github.i ...

  8. TestDriven.NET 怎么设置快捷键keyboard shortcut(转)

    TestDriven.NET 怎么设置快捷键keyboard shortcut 使用TestDriven.NET 测试的时候,觉得点击鼠标很麻烦是不是?嗯,我也觉得,那么我们来看看怎么设置它的快捷键把 ...

  9. kafka存储数据量过大,导致磁盘爆满

    问题: 注意到自己负责kafka的某个topic最小的偏移量为0,而最大的偏移量都7亿多了,说明存储在kafka里面的数据没有定时删除,通过登陆到kafka服务器,查看配置文件services.pro ...

  10. P1283 平板涂色

    P1283 平板涂色 dfs 记忆化搜索 将矩阵转化为图求解,然后我们发现这是个DAG,于是就可以愉快地跑搜索了. 进行dfs时,我们可以用类似拓扑排序的方法.每次将上面所有矩形都被刷过(入度in[ ...