POJ2176 Folding
POJ2176 Folding
描述
给定一个长度不超过100的字符串,求其“压缩”后长度最短的字符串。如有多个,输出任意即可。
其中对于一个字符串\(str\)的“压缩”\(F(str)\)定义如下:
当\(|str|=1\)时,有\(F(str)=str\),\(|F(str)|=1\)。
\(F(str_1+str_2)=F(str_1)+F(str_2)\)
\(X(str)\)是字符串\(\underbrace{str+str+\cdots+str}_X\)的压缩,且\(|X(str)|=\lfloor\lg X\rfloor+|str|+2\),即包含括号和数字本身。
如字符串
AAAAAAAAAABABABCCD的最短压缩为9(A)3(AB)CCD,长度由\(18\)降为\(12\)。注意2(C)的长度为\(4\),不会比CC更优。压缩可以嵌套。如
AAAAAAABAAAAAAAABA可以压缩为2(7(A)BA)。
思路
设\(F(l,r)\)表示合并字符串\(S_{l\cdots r}\)得到的最短长度。根据定义,字符串的压缩具有叠加性,得到:
\]
其中\(\text{cost}\)函数表示\(S_{l\cdots r}\)直接被压缩后的长度;若其不能被压缩,则返回\(\infty\)。
子串\((l,r)\)本身就可能被压缩。我们可以考虑从\(1\)至\(\frac{len}{2}\)枚举模式串的长度,如果匹配,则将压缩之后的字符串及其长度作为一个初始决策。之后再枚举合并子区间的价值就可以了。
代码
#include <cstdio>
#include <cstring>
#include <cctype>
using namespace std;
#define rg register
#define openFile(z) freopen(z".in", "r", stdin), freopen(z".out", "w", stdout)
typedef long long ll;
template<class type> inline type quickRead(type sample)
{
type ret = 0, sign = 1; char ch = getchar();
while(! isdigit(ch))
sign = ch == '-' ? -1 : 1, ch = getchar();
while(isdigit(ch))
ret = ret * 10 + ch - '0', ch = getchar();
return sign == -1 ? -ret : ret;
}
const int maxLen = 102;
const int Inf = 0x3f3f3f3f;
struct sub_string
{
char str[maxLen];
int len;
}F[maxLen][maxLen];
char template_string[maxLen];
int Len;
inline void break_point()
{}//用于debug
int main()
{
openFile("POJ2176");
scanf("%s", template_string + 1);
Len = strlen(template_string + 1);
for(rg int i = 1; i <= Len; ++ i)
{
F[i][i].str[0] = template_string[i],
F[i][i].len = 1;
}//初始化,单个字符的最短长度只能是1.
for(rg int len = 2; len <= Len; ++ len)
{
for(rg int l = 1, r = len ; r <= Len; ++ l, ++ r)
{
F[l][r].len = Inf;
for(rg int sub_string_len = 1; sub_string_len <= len >> 1; ++ sub_string_len)
{
//枚举模式串的长度并匹配
if(len % sub_string_len != 0)
continue;//优化:模式串的长度一定是原串的某个约数
int match_left = l, match_right = l + sub_string_len;
while(template_string[match_left] == template_string[match_right] && match_right <= r)
{
++ match_left;
++ match_right;
}
if(match_right > r)//匹配成功
{
sprintf(F[l][r].str, "%d", (r - l + 1) / sub_string_len);
strcat(F[l][r].str, "(");
strcat(F[l][r].str, F[l][l + sub_string_len - 1].str);
strcat(F[l][r].str, ")");
F[l][r].len = strlen(F[l][r].str);//将“压缩自己”作为一个候选决策
break;
}
}
for(rg int k = l; k < r; ++ k)
{
if(F[l][k].len + F[k + 1][r].len < F[l][r].len)//枚举“合并区间”的决策
{
F[l][r].len = F[l][k].len + F[k + 1][r].len;
strcpy(F[l][r].str, F[l][k].str);
strcat(F[l][r].str, F[k + 1][r].str);
}
}
}
}
puts(F[1][Len].str);
return 0;
}
POJ2176 Folding的更多相关文章
- poj2176 Folding【区间DP】
Folding Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 1841 Accepted: 642 Special ...
- 常规DP专题练习
POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...
- Codeforces Gym 100002 Problem F "Folding" 区间DP
Problem F "Folding" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/ ...
- eclipse 插件之Code Folding
功能: eclipse自带折叠包括方法, import, 注释等得折叠功能, code folding 插件对其增强. 1. 下载插件:( 也可以用link方式, 我的是link安装, jar包网上很 ...
- Android Folding View(折叠视图、控件)
版本号:1.0 日期:2014.4.21 版权:© 2014 kince 转载注明出处 非常早之前看过有人求助以下这个效果是怎样实现的, 也就是側滑菜单的一个折叠效果,事实上关于这个效果的实现,谷 ...
- Chrome Dev Tools: Code Folding in CSS and Javascript for improved code readiability
Note : Apply for google chrome canary. You can fold code blocks in CSS (and Sass) and javascript fil ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) E. Tree Folding 拓扑排序
E. Tree Folding 题目连接: http://codeforces.com/contest/765/problem/E Description Vanya wants to minimiz ...
- Eclipse折叠代码 coffee bytes code folding
提供一个插件下载地址,博客园的: http://files.cnblogs.com/wucg/com.cb.eclipse.folding_1.0.6.jar.zip 将下载的zip文件解压出来的j ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) E. Tree Folding
地址:http://codeforces.com/contest/765/problem/E 题目: E. Tree Folding time limit per test 2 seconds mem ...
随机推荐
- 合并两个排序链表——牛客offer
题目描述: 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路: 1.一般看到合并这类的题目就会很自然的想到创建一个新的链表,然后将两个链表根据一定 ...
- pat L2--005 简单复习一下并差集
布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输入格式: ...
- 帝国cms列表内容模板加上数字编号
/*这个[!--no.num--]指的是信息编号.每次增加1*/ <li data-eq="[!--no.num--]"> <div class="ti ...
- GitLab 部署及管理员账号初始化
Linux系统搭建GitLab---阿里云Centos7搭建Gitlab踩坑一.简介GitLab,是一个利用 Ruby on Rails 开发的开源应用程序,实现一个自托管的Git项目仓库,可通过We ...
- Centos7查不出ip地址
今天遇到了这个问题,解决后记录一下: //输入查询命令 ifconfig或者ip addr 如图,是显示不出信息的 找到ens33的配置文件,输入命令 vi /etc/sysconfig/networ ...
- 以tomcat镜像为基础部署war包后再做成镜像
#以交互的方式启动本地的镜像tomcat:hps,并且将本地目录/mnt/iso挂在到容器中的/tmp/repositories目录,方便从本地获取一些安装文件并进行一些操作 docker run - ...
- 第二章· MySQL体系结构管理
一.客户端与服务器模型  1.mysql是一个典型的C/S服务结构 1.1 mysql自带的客户端程序(/application/mysql/bin) mysql mysqladmin mysqld ...
- stm32定时器计数功能
stm32的外部时钟源模式2和外部时钟源模式1都可以用来实现计数功能,他们的区别是什么呢? 以上2种模式对应不同的管脚输入: 外部时钟源模式2 <-->TIMx_ETR 外部时钟源模式1 ...
- deep_learning_Function_os.makedirs()
Python 3.2+ os.makedirs(path, exist_ok=True) python 3.2创建目录新增了可选参数existok,把existok设置True,创建目录如果已经存在则 ...
- js动态添加控件(输入框为例)
写在前面 昨天得到一个需求,需要在账户登记页面中动态添加输入框,经过半天的捣鼓,最终完美成型,写下来跟大家分享下, 供大家参考 开始复制代码了 如果复制了我所有代码的话,注意看js最后面方法的备注,最 ...