题目

ans[i][j]表示由原串第i个字符到第j个字符组成的子串的最短折叠长度
如果从i到j本身可以折叠,长度就是本身长度或折叠后的长度的最小值
***此处参考:http://blog.csdn.net/a197p/article/details/48701227
(自己只能想到去掉左边或右边字母,这样难以转移状态)
如果不能,就是将其分成两个子串后子串连接起来长度的最小值(如果比本身长度还大则取本身)
如果能折叠的显然一定是折叠比分成两段好,当然如果不确定可以折叠、不折叠都试一下,然后取长度最小值

 #include<iostream>
#include<cstring>
#include<string>
using namespace std;
string str;
int ans[][];
string ans2[][];
void dp(int l,int r)
{
if(r==l)//由于下面写的是i=1,i<len, 可以在只有1个字符时特判
{
ans[l][l]=;
ans2[l][l]=str[l];
return;
}
bool flag,flag2=false;
int len=r-l+,i,j;
string temp,temp2;
ans2[l][r]=str.substr(l,r-l+);
for(i=;i<len;i++)//枚举每段i字符,循环暴力求是否是可以折叠的
if(len%i==)//如果每段i字符可以分成整数段
{
flag=false;
temp=str.substr(l,i);//记录下第一段
for(j=i;j<len;j+=i)
if(temp!=str.substr(l+j,i))//如果分出来的某一段跟第一段不符,就是不能折叠
{
flag=true;
break;
}
if(flag==false)//如果分出来的所有段都跟第一段相同,就是能折叠
{
flag2=true;
if(ans[l][l+i-]==0x3f3f3f3f)//曾经忘了,导致无法过UUUUUUUGLUUUUUUUGLZ
dp(l,l+i-);//如果是折叠,只需更新第一段的最小长度
//temp2=len/i+48;//这样错的,超过9的数字就不行了
char c[];//存储折叠的次数转换成的字符串
sprintf(c,"%d",len/i);
temp2=c;
temp2+='('+ans2[l][l+i-]+')';
//temp2的构成是折叠的次数(就是c)+'('+最短的第一段+')'
//直接写temp2=c+...会出奇怪的问题,可能跟参与运算的类型太混乱(string,char,char*)有关系
if(ans2[l][r].length()>temp2.length())//如果折叠完比原串短或者比之前找到的某种折叠方法短就更新
ans2[l][r]=temp2;
}
}
if(flag2==true)//如果能折叠的显然一定折叠比分成左右两段好
{
ans[l][r]=ans2[l][r].length();
}
else
{
for(i=l;i<r;i++)//分成l~i和(i+1)~r两段,显然i可以为l~(r-1)
{
if(ans[l][i]==0x3f3f3f3f)
dp(l,i);
if(ans[i+][r]==0x3f3f3f3f)
dp(i+,r);
if(ans[l][i]+ans[i+][r]<ans[l][r])
{
ans[l][r]=ans[l][i]+ans[i+][r];
ans2[l][r]=ans2[l][i]+ans2[i+][r];
}
}
}
}
int main()
{
while(cin>>str)
{
memset(ans,0x3f,sizeof(ans));
dp(,str.length()-);
cout<<ans2[][str.length()-]<<'\n';
}
return ;
}

Folding UVA - 1630的更多相关文章

  1. UVa 1630 Folding (区间DP)

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

  2. UVa 1630 区间DP Folding

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

  3. 【Uva 1630】Folding

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

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

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

  5. Uva 1630 折叠串

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

  6. 习题9-4 uva 1630

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

  7. UVa 1630 串折叠

    https://vjudge.net/problem/UVA-1630 题意: 给出一个由大写字母组成的长度为n的串,折叠成一个尽量短的串.例如:AAAAAAAAABABABCCD折叠成9(A)3(A ...

  8. Paper Folding UVA - 177 模拟+思路+找规律

    题目:题目链接 思路:1到4是很容易写出来的,我们先考虑这四种情况的绘制顺序 1:ru 2:rulu 3:rululdlu 4:rululdluldrdldlu 不难发现,相较于前一行,每一次增加一倍 ...

  9. UVA 12649 Folding Machine 搜索

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...

随机推荐

  1. shell学习五十六天----延迟进程调度

    延迟进程调度 前言:大部分时候,我们都希望进程快点開始,开点结束,别卡.而shell的运行,也是在前一个命令后,立即接着运行下一个命令.命令完毕的速度是与资源的限制有关,且不在shell的权限下. 在 ...

  2. 树莓派wiringPi经常使用的函数介绍

     1.void pinMode (int pin, int mode) ; 这个函数式设置pin脚的输入和输出模式以及PWM的输入和输出模式.在wiringPi中仅仅有 pin 1 (BCM_GP ...

  3. JAVA变量存储

    1.java变量存储域 java变量的存储区域主要放在以下几个地方: (1)寄存器:可以说是最快的存储区,在C/C++中可以声明寄存器变量,但是在java中不能声明寄存器变量,只是编译器在编译时确定. ...

  4. Kafka在Windows安装运行

    摘要:本文主要说明了如何在Windows安装运行Kafka 一.安装JDK 过程比较简单,这里不做说明. 最后打开cmd输入如下内容,表示安装成功 二.安装zooeleeper 下载安装包:http: ...

  5. bzoj4103: [Thu Summer Camp 2015]异或运算

    对于每个询问暴力枚举x~y,然后在Trie去找第k大,开始我写了个二分答案然后算比当前答案大的个数,打了个第10个点的表就跑出19s+比bzoj垫底还慢4s+ 然而不用二分,直接1000个点一起在树上 ...

  6. asp.net cookie and session

    客户端只保存session id,信息存在服务端 Session状态应该存储在两个地方,分别是客户端和服务器端. 客户端只负责保存相应网站的SessionID,而其他的Session信息则保存在服务器 ...

  7. vue 更改头像功能实现

     ——————– 如上图所示:需要完成的功能是点击更改头像,获取本地文件库,选择图片后将原始图片替换.这里我就直接用html文件引入vue来简单实现在这功能,代码如下: HTML: <div i ...

  8. 用 javascript 操作 xml

    1. [代码]js代码     <script language="JavaScript"><!--var doc = new ActiveXObject(&qu ...

  9. android.annotation.SuppressLint

    Lint是一个静态检查器,它围绕Android项目的正确性.安全性.性能.可用性以及可访问性进行分析.它检查的对象包括XML资源.位图.ProGuard配置文件.源文件甚至编译后的字节码. Lint包 ...

  10. oracle long 转varchar2

    函数: /* 其中in_rowid为行id,in_owner为数据库登陆的帐号名,in_table_name为数据库表名,in_column为数据库对应long类型的表字段名称 */ CREATE O ...