Folding UVA - 1630
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的更多相关文章
- UVa 1630 Folding (区间DP)
题意:折叠一个字符串,使得其成为一个尽量短的字符串 例如AAAAAA变成6(A) 而且这个折叠是可以嵌套的,例如 NEEEEERYESYESYESNEEEEERYESYESYES 会变成 2(N5( ...
- UVa 1630 区间DP Folding
一个字符串如果能简写,要么是重复多次,按题中的要求简写:要么是左右两个部分分别简写后再拼起来. dp(i, j)表示字串(i, j)所能被简写的最短的字符串. 判断一个字符串是否为周期串以及求出它的周 ...
- 【Uva 1630】Folding
[Link]: [Description] 你能对字符串进行压缩的操作; 即把连续出现的相同的子串改成它出现的次数+这个最基本的字符串的形式; 问你这个字符串最短能被压缩得多短; [Solution] ...
- UVA - 1630 Folding(串折叠)(dp---记忆化搜索)
题意:给出一个由大写字母组成的长度为n(1<=n<=100)的串,“折叠”成一个尽量短的串.折叠可以嵌套.多解时可输出任意解. 分析: 1.dp[l][r]为l~r区间可折叠成的最短串的长 ...
- Uva 1630 折叠串
题目链接:https://uva.onlinejudge.org/external/16/1630.pdf 题意:折叠串,给一个字符串,相同部分可以折叠,折叠可以嵌套.求最短长度的一种折叠方法.括号和 ...
- 习题9-4 uva 1630
题意: 给你一串数字,要求你对其进行折叠使其长度最短. 折叠情况:全是一个字母 & 重复的字符串 AAAAAAAAAABABABCCD --> 9(A)3(AB)CCD NEE ...
- UVa 1630 串折叠
https://vjudge.net/problem/UVA-1630 题意: 给出一个由大写字母组成的长度为n的串,折叠成一个尽量短的串.例如:AAAAAAAAABABABCCD折叠成9(A)3(A ...
- Paper Folding UVA - 177 模拟+思路+找规律
题目:题目链接 思路:1到4是很容易写出来的,我们先考虑这四种情况的绘制顺序 1:ru 2:rulu 3:rululdlu 4:rululdluldrdldlu 不难发现,相较于前一行,每一次增加一倍 ...
- UVA 12649 Folding Machine 搜索
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
随机推荐
- vue class与style绑定、条件渲染、列表渲染
列表渲染 根据我例子的需要,先来说下,列表渲染使用到的是v-for指令,需要使用 item in items 形式的特殊语法,items 是源数据数组并且 item 是数组元素迭代的别名,具体使用方法 ...
- linux安装jdk tomcat nginx 以及常用命令
linux: 操作系统,应用服务器上 常用命令: cd 切换命令 cd / cd ~ cd ../../ cd xx ll 展示所有的文件 ll -h 友好的展示 mkdir 创建目录 mkdir 目 ...
- Preference+PreferenceArray+DataModel
在Mahout中,用户的喜好被抽象为一个Preference,包含了userId,itemId和偏好值(user对item的偏好).Preference是一个接口,它有一个通用的实现是GenericP ...
- debian配置集锦
1 关闭蜂鸣 在/etc/bash.bashrc中加入下面的行: setterm -blength=0 2 debian bash路径显示太长 将.bashrc中的 else PS1='${debia ...
- Hadoop spark mongo复制集
启动hadoop cd /usr/local/hadoop/hadoop $hadoop namenode -format # 启动前格式化namenode $./sbin/start-all.sh ...
- BZOJ2327: [HNOI2011]勾股定理
BZOJ2327: [HNOI2011]勾股定理 Description 题解Here! 这是一道神题... 我一开始把题目看错了,我以为是在$n$根木棒中选两个$i,j$满足$gcd(i,j)==1 ...
- JSP 使用 JDBC连接SQL Server
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- gnss到底是什么呢
GNSS Global Navigation Satellite System 全球卫星导航系统:提到这个很多人会不明白GNSS倒是是个啥东西呢,和北斗,GPS, GLONASS,Galileo系统有 ...
- vue 做登陆页面 ( 登陆成功后去掉注册和登陆按钮 显示用户名)
1.当登陆成功 显示用户名且去掉登陆和注册按钮 2.data里声明 后 就在登陆的方法里调用啦 下面说一下登陆的方法. 1.登陆的按钮代码在第一张图片里 2.登陆的弹出框 3.方法 ps:另一种 ...
- hdu 4463 Outlets(最小生成树)
题意:n个点修路,要求总长度最小,但是有两个点p.q必须相连 思路:完全图,prim算法的效率取决于节点数,适用于稠密图.用prim求解. p.q间距离设为0即可,最后输出时加上p.q间的距离 pri ...