题目

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. Android的onMeasure方法

    在Android开发中,当Android原生控件不能满足我们的需求的时候,就需要自定义View.View在屏幕上绘制出来先要经过measure(计算)和layout(布局). 什么时候调用onMeas ...

  2. BZOJ 3992: [SDOI2015]序列统计 快速幂+NTT(离散对数下)

    3992: [SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属于集合S ...

  3. SpringInAction4笔记——web

    1,java配置 extends AbstractAnnotationConfigDispatcherServletInitializer public class SpitterWebInitial ...

  4. Flume接收器组的指数退避上限

    指数退避 agent.sinkgroups.sg1.sinks=k1,k2,k3agent.sinkgroups.sg1.processor.type=failoveragent.sinkgroups ...

  5. SpringMVC 学习笔记(四) 处理模型数据

    Spring MVC 提供了下面几种途径输出模型数据: – ModelAndView: 处理方法返回值类型为 ModelAndView时, 方法体就可以通过该对象加入模型数据 – Map及Model: ...

  6. YTU 2451: 股市风云

    2451: 股市风云 时间限制: 1 Sec  内存限制: 128 MB 提交: 37  解决: 25 [提交][状态][讨论版] 题目描述 股市强烈动荡,有涨有跌.现在有一组数据表示各公司的涨跌(涨 ...

  7. 简单的JDBC编程步骤

    1.加载数据库驱动(com.mysql.jdbc.Driver) 2.创建并获取数据库链接(Connection) 3.创建jdbc statement对象(PreparedStatement) 4. ...

  8. OpenCV——PS滤镜算法之 Ellipsoid (凹陷)

    // define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...

  9. 枚举子集 Codeforces306 Div2 B

    题目 分析:用二进制法去枚举子集,同时判断满足条件的子集个数加1 #include "iostream" #include "cstdio" using nam ...

  10. CTR预估经典模型总结

    计算广告领域中数据特点:    1 正负样本不平衡    2 大量id类特征,高维,多领域(一个类别型特征就是一个field,比如上面的Weekday.Gender.City这是三个field),稀疏 ...