题意:

给你一串数字,要求你对其进行折叠使其长度最短。
折叠情况:全是一个字母 & 重复的字符串

AAAAAAAAAABABABCCD    -->   9(A)3(AB)CCD
NEERCYESYESYESNEERCYESYESYES      -->       2(NEERC3(YES))

思路:

用dp[i][j]表示从 i 到 j 的最短情况。 不停的往下找,得到 i 到 j 的字符串后,再判断能否折叠
大致思路如此,中间WR了一把,在将长度转换成字符型时直接用的 t + ‘0’,WR后发现大于9就木有了- -,这智商
强行坑自己一波。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. using namespace std;
  6. const int maxn = 105;
  7. int dp[maxn][maxn];
  8. string ans[105][105];
  9. string s;
  10.  
  11. int judge(int l,int r) //判断折叠
  12. {
  13. int i,j;
  14. bool flag =true;
  15. for(i = 1; i <= (r-l+1)/2; i++)
  16. {
  17. if((r-l+1) % i) continue;
  18. flag = true;
  19. for(j = l; j+i <= r; j++)
  20. {
  21. if(s[j] != s[j+i])
  22. {
  23. flag = false;
  24. break;
  25. }
  26. }
  27. if(flag)
  28. return i;
  29. }
  30. return false;
  31. }
  32.  
  33. int dfs(int l,int r)
  34. {
  35. if(dp[l][r] != -1)
  36. return dp[l][r];
  37. if(l == r)
  38. {
  39. dp[l][r] = 1;
  40. ans[l][r] = s[l];
  41. return 1;
  42. }
  43.  
  44. int tt = 0x3f3f3f3f;
  45. int k;
  46. for(int i = l; i < r; i++) //找出最短
  47. {
  48. int tmp = dfs(l,i) + dfs(i+1,r); //左右两段合并
  49. if(tt > tmp)
  50. {
  51. k = i;
  52. tt = tmp;
  53. }
  54. }
  55. // cout << l <<" " << r << endl;
  56. ans[l][r] = ans[l][k] + ans[k+1][r]; //得到临时最短NEERC3(YES)NEERC3(YES)
  57. tt = dp[l][k] + dp[k+1][r];
  58.  
  59. int flag = judge(l,r); //再次判断能否折叠,例:NEERC3(YES)NEERC3(YES) -> 2(NEERC3(YES))
  60. if(flag)
  61. {
  62. char orz[5];
  63. int t = (r-l+1)/flag;
  64. sprintf(orz,"%d",t);
  65. string tans = string(orz)+"("+ans[l][l+flag-1]+")";
  66. if(tans.size() < tt)
  67. {
  68. tt = tans.size();
  69. ans[l][r] = tans;
  70. }
  71. }
  72. // cout <<ans[l][r] <<" " << l << " " << r << endl;
  73. return dp[l][r] = tt;
  74. }
  75.  
  76. int main()
  77. {
  78. while(cin >> s)
  79. {
  80. int len = s.size()-1;
  81. memset(dp,-1,sizeof(dp));
  82. dfs(0,len);
  83. cout<<ans[0][len]<<endl;
  84. }
  85. return 0;
  86. }

  

习题9-4 uva 1630的更多相关文章

  1. Uva 1630 折叠串

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

  2. UVa 1630 Folding (区间DP)

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

  3. UVa 1630 串折叠

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

  4. UVa 1630 区间DP Folding

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

  5. Folding UVA - 1630

    题目 ans[i][j]表示由原串第i个字符到第j个字符组成的子串的最短折叠长度如果从i到j本身可以折叠,长度就是本身长度或折叠后的长度的最小值***此处参考:http://blog.csdn.net ...

  6. 【Uva 1630】Folding

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

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

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

  8. ACM训练计划建议(写给本校acmer,欢迎围观和指正)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

  9. ACM训练计划建议(转)

    ACM训练计划建议 From:freecode#  Date:2015/5/20 前言: 老师要我们整理一份训练计划给下一届的学弟学妹们,整理出来了,费了不少笔墨,就也将它放到博客园上供大家参考. 菜 ...

随机推荐

  1. 玩转Leveldb原理及源码--拙见1

    可以说是不知天高地厚.. 可以说是班门弄斧.. 但是,我今天还就这样走了,我喜欢!!!!!! 注:后续文章,限于篇幅,不懂名词都有 紫色+下划线 超链接,有兴趣,可以查阅: 网上关于Leveldb 的 ...

  2. Flask 扩展 Mail

    安装 pip install flask-mail from flask import Flask from flask_mail import Mail, Message app = Flask(_ ...

  3. [笔试题目]使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍?

    [笔试题目] 使用Stringbuffer无 参的构造函数创建 一个对象时,默认的初始容量是多少? 如果长度不够使用了,自动增长多少倍? StringBuffer 底层是依赖了一个字符数组才能存储字符 ...

  4. 为什么java中用枚举实现单例模式会更好

    代码简洁 这是迄今为止最大的优点,如果你曾经在Java5之前写过单例模式代码,那么你会知道即使是使用双检锁你有时候也会返回不止一个实例对象.虽然这种问题通过改善java内存模型和使用volatile变 ...

  5. Extensions in UWP Community Toolkit - FrameworkElement Extensions

    概述 UWP Community Toolkit Extensions 中有一个为FrameworkElement 提供的扩展 - FrameworkElement Extensions,本篇我们结合 ...

  6. C# 文件操作类大全

      C# 文件操作类大全 时间:2015-01-31 16:04:20      阅读:1724      评论:0      收藏:0      [点我收藏+] 标签: 1.创建文件夹 //usin ...

  7. NOPI实现导入导出泛型List,支持自定义列

    概述 业务上需要自定义列的Excel的导入导出,在网上看了好多资料,很多都是有Bug而且都是支持Excel和DataTable的转换,所以自己总结了一下,应用.NET平台上的NPOI封装了支持自定义列 ...

  8. windows下nginx代理ftp服务器

    我所在的开发环境里,nginx和ftp在同一台服务器. ftp根目录: nginx的配置: 在nginx.conf中加入: server { listen ; server_name localhos ...

  9. Python入门之PyCharm的快捷键与常用设置和扩展(Win系统)

    1.  PyCharm的快捷键 2 . PyCharm的常用设置和扩展 ---------------------------------------------------------------- ...

  10. ConcurrentHashMap基于JDK1.8源码剖析

    前言 声明,本文用的是jdk1.8 前面章节回顾: Collection总览 List集合就这么简单[源码剖析] Map集合.散列表.红黑树介绍 HashMap就是这么简单[源码剖析] LinkedH ...