题目链接:https://uva.onlinejudge.org/external/16/1630.pdf

题意:折叠串,给一个字符串,相同部分可以折叠,折叠可以嵌套。求最短长度的一种折叠方法。括号和数字的长度也要考虑进去。

刚看到这个题目,没有一点思路,还是大牛们厉害!

分析:一个串,可以转成两种形式,要么本身可以转成有重叠部分的串,要么分成两个部分,再转成有重叠部分的串。

本身是否是重叠串,利用kmp查,分成两个部分,遍历一遍所有情况,这样,dp顺序就出来了,最外层是每次查的长度,第二层就是,利用这个长度,从每一个点开始查起。状态描叙是d[i][j]从 i  到 j 的最短字符串。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3
 4 const int maxn = 100 + 10;
 5
 6 string d[maxn][maxn];
 7 char s[maxn],t[maxn];
 8
 9
10
11 int f[maxn];
12
13 string ToString(int x)
14 {
15     string ans = "";
16     while(x)
17     {
18         ans +=(char)('0'+(x%10));
19         x/=10;
20     }
21     reverse(ans.begin(),ans.end());
22     return ans;
23 }
24
25 void getFail(char* s)
26 {
27     int len = strlen(s);
28     f[0] = f[1] = 0;
29     for(int i=1; i<len; i++)
30     {
31         int j = f[i];
32         while(j&&s[i]!=s[j])
33             j = f[j];
34         f[i+1] = s[i]==s[j] ? j+1:0;
35     }
36 }
37
38 int main()
39 {
40     while(scanf("%s",s)!=EOF)
41     {
42         int len = strlen(s);
43         for(int i=0; i<len; i++)
44             d[i][i] = string("")+s[i];
45
46
47         for(int l=2; l<=len; l++)
48         {
49             for(int i=0; i + l - 1 < len; i++)
50             {
51                 int j = i + l - 1;
52                 d[i][j] = "";
53                 for(int k=i; k<=j; k++)
54                 {
55                     d[i][j] +=s[k];
56                     t[k-i] = s[k];
57                 }
58
59                 t[j-i+1] = 0;
60                 getFail(t);
61                 if(l%(l-f[l])==0)   //自身是重复的
62                 {
63                     int cycle = l - f[l];
64                     string t = "";
65                     t = ToString(l/cycle);
66                     t+='(';
67                     t+=d[i][i+cycle-1];
68                     t+=')';
69                     if(t.length()<d[i][j].length()) d[i][j] = t;
70                 }
71
72                 for(int k=i; k<j; k++)
73                 {
74                     if(d[i][k].length()+d[k+1][j].length()<d[i][j].length())
75                     {
76                         d[i][j] = d[i][k] + d[k+1][j];
77                     }
78                 }
79             }
80         }
81         cout<<d[0][len-1]<<endl;
82     }
83     return 0;
84 }

转载于:https://www.cnblogs.com/TreeDream/p/6240805.html

Uva 1630 折叠串相关推荐

  1. uva 1630——Folding

    题意:给出一个由大写字母组成的长度为n的串,然后尽量折叠成一个尽量短的串,折叠可以嵌套. 思路:区间dp,dp(i,j)表示区间(i,j)的最短的串的长度,as(i,j)表示i到j的答案,有两个状态要 ...

  2. UVA 1630 Folding

    题目链接:http://acm.hust.edu.cn/vjudge/problem/51191 题意:给一个字符串,相同部分可以折叠,折叠可以嵌套.求最短长度的一种折叠方法.括号和数字的长度也要考虑 ...

  3. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  4. c语言的四大圣经,传说中的模拟电子四大圣经--值得永久珍藏

    目录 第一章 集成电路放大器件模型 1.1 引言 1.2 PN结的耗尽区 1.3 双极型晶体管的大信号特性 1.4 双极型晶体管的小信号模型 1.5 金属氧化物效晶体管的大信号特性 1.6 MOS晶体 ...

  5. [搜索]UVa 129 困难的串

    题意:将一个包含两个相邻的重复子串的子串,称为"容易的串",其他为"困难的串". 输入正整数n和l,输出由前l个字符组成的,字典序第n小的困难的串. 输入样例: ...

  6. UVa 11027 - Palindromic Permutation 回文串,组合加搜索

    http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=115&page=s ...

  7. UVA - 11584 Partitioning by Palindromes(划分成回文串)(dp)

    题意:输入一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000. 分析: 1.dp[i]为字符0~i划分成的最小回文串的个数. 2.dp[j] = Min(dp[j ...

  8. 回文串 --- 动态dp UVA 11584

    题目链接: https://cn.vjudge.net/problem/34398/origin 本题的大意其实很简单,就是找回文串,大致的思路如下: 1. 确定一个回文串,这里用到了自定义的chec ...

  9. UVA - 129 Krypton Factor (困难的串)(回溯法)

    题意:求由字母表前L个字母组成的字典序第n小的困难串.(如果一个字符串包含两个相邻的重复子串,则称它是"容易的串",其他串称为"困难的串".) 分析:回溯时,检 ...

最新文章

  1. DotNet Core Console 程序使用NLog
  2. SIGGRAPH2018黑科技:开源语义软分割改进图像编辑
  3. 北京某打工子弟学校之二
  4. iOS - 上架的APP 生成二维码下载
  5. 对PostgreSQL中后台进程内存挂载的初步学习
  6. windows mysqldump 不成功 1049 1064 报错
  7. 对象工厂PHP,php – 域对象工厂是什么样的?
  8. 华为申请注册华为鸿蒙商标,华为申请注册“华为鸿蒙”商标,自研操作系统或将实现?-控制器/处理器-与非网...
  9. win10开发java_java的开发环境(win10)
  10. fastjson使用-- @JSONField使用(转)
  11. [Linux/Unix]常用命令
  12. Java职业规划(职业晋升路线、技术转移路线、工作经验与技术栈的匹配)——学习笔记
  13. 重装系统是否影响计算机,电脑重装系统会对电脑造成伤害吗? 答案说出来你可能都不信...
  14. 推荐系统深度学习篇-NFM 模型介绍(1)
  15. Linux如何测试驱动性能,掌握 Linux PC 性能之基准测试
  16. word无法验证服务器,Win8系统打开office文件提示“无法验证此产品的许可证”如何解决...
  17. html图片不平铺,css图片不平铺怎么设置?
  18. 常用的c语言,C语言常用.docx
  19. 洛达应用层开发教程系列1-UI框架
  20. 电脑桌面图标不见了怎么回事?正确的找回图标的2个方案

热门文章

  1. C#使用SetWindowsHookEx时报错“类型的已垃圾回收委托进行了回调”
  2. Web开发编程语言是最适合新手的吗-开课吧
  3. C++基础:C++的路径表示有哪些
  4. QTP自动化测试从零基础到精通进阶(脚本测试、VBS语法、描述性编程、测试框架)...
  5. linux中nmcli命令使用及网络配置
  6. BSGS-BabyStepGiantStep算法+拓展
  7. C#会对于未赋值的变量/成员变量,给予一个初始值吗?
  8. 同一主机,不同域名绑定不同网站(IIS主机头实现方法)
  9. Nagios+Cacti模块——Nagios+Cacti 搭建及整合(一)
  10. RFID Cooking with Mifare Classic