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}\)得到的最短长度。根据定义,字符串的压缩具有叠加性,得到:

\[F(l,r) = \min\limits_{l \leq k < r}\{F(l,k) + F(k,r+1),\text{cost}(l,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的更多相关文章

  1. poj2176 Folding【区间DP】

    Folding Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1841   Accepted: 642   Special ...

  2. 常规DP专题练习

    POJ2279 Mr. Young's Picture Permutations 题意 Language:Default Mr. Young's Picture Permutations Time L ...

  3. Codeforces Gym 100002 Problem F "Folding" 区间DP

    Problem F "Folding" Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/ ...

  4. eclipse 插件之Code Folding

    功能: eclipse自带折叠包括方法, import, 注释等得折叠功能, code folding 插件对其增强. 1. 下载插件:( 也可以用link方式, 我的是link安装, jar包网上很 ...

  5. Android Folding View(折叠视图、控件)

    版本号:1.0 日期:2014.4.21 版权:© 2014 kince 转载注明出处 非常早之前看过有人求助以下这个效果是怎样实现的,   也就是側滑菜单的一个折叠效果,事实上关于这个效果的实现,谷 ...

  6. 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 ...

  7. 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 ...

  8. Eclipse折叠代码 coffee bytes code folding

    提供一个插件下载地址,博客园的: http://files.cnblogs.com/wucg/com.cb.eclipse.folding_1.0.6.jar.zip  将下载的zip文件解压出来的j ...

  9. 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 ...

随机推荐

  1. Pytest+allure安装和框架搭建

    接口自动化框架搭建 -- 公司系统自测使用,只跑核心业务流程 编辑中...... 1.安装Pytest pip install -U pytest 1.1Pycharm测试脚本运行 创建project ...

  2. java lesson20homework

    package com.xt.lesson20; /** * 简易自动提款机 1. 创建用户类User(包含卡号.姓名.密码.余额等属性),用户开卡时录入的姓名和密码(自动分配一个卡号.初始金额设置为 ...

  3. Advanced Installer 不弹出预安装的软件的窗口

    需求:当他电脑上没有sql server client 的时候,或没有localdb的时候,那么安装包会弹出窗口,让他选择 一个组件 一个组件的安装 太麻烦. 有没有办法,打开安装包就安装 安装的过程 ...

  4. elementui按需加载

    定义一个ele.js文件 官网:https://element.eleme.io/#/zh-CN/component/quickstart // 方法1 import 'element-ui/lib/ ...

  5. HTML的学习2(代码)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. vscode快捷操作

    Ctrl + `                     打开或关闭终端 Ctrl + Shift + n         打开或关闭新窗口 Ctrl + Shift + f 打开视图,显示编辑器左侧 ...

  7. vue项目中实现图片懒加载的方法

    对于图片过多的页面,为了加速页面加载速度,所以很多时候我们需要将页面内未出现在可视区域内的图片先不做加载, 等到滚动到可视区域后再去加载.这样子对于页面加载性能上会有很大的提升,也提高了用户体验. 实 ...

  8. Gephi简单导入数据

    使用工具 Gephi-0.9.2 事前要导入的数据 Node.csv 节点:名称可以所以定,格式.csv Edge.csv 边:名称可以所以定,格式.csv 导入操作 新建项目 导入节点 新建列要与表 ...

  9. useradd 报Creating mailbox file: File exists

    问题描述:增加一个用户时,报下面的错误:[root@master ~]# useradd hadoopuseradd: warning: the home directory already exis ...

  10. kbmMW均衡负载与容灾(1)

    kbmMW为均衡负载与容灾提供了很好的机制,支持多种实现方式,现在看看最简单的一种,客户端控制的容灾和简单的负载均衡. 现在,我们将kbmMWServer部署到不同的服务器,或者在同一服务器部署多份实 ...