一个字符串如果能简写,要么是重复多次,按题中的要求简写;要么是左右两个部分分别简写后再拼起来。

dp(i, j)表示字串(i, j)所能被简写的最短的字符串。

判断一个字符串是否为周期串以及求出它的周期用的KMP算法。

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

代码君

UVa 1630 区间DP Folding的更多相关文章

  1. BZOJ 1260&UVa 4394 区间DP

    题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...

  2. UVA 1626 区间dp、打印路径

    uva 紫书例题,这个区间dp最容易错的应该是(S)这种匹配情况,如果不是题目中给了提示我就忽略了,只想着左右分割忘记了这种特殊的例子. dp[i][j]=MIN{dp[i+1][j-1] | if( ...

  3. 紫书 例题 9-9 UVa 10003 (区间dp+递推顺序)

    区间dp,可以以一个区间为状态,f[i][j]是第i个切点到第j个切点的木棍的最小费用 那么对于当前这一个区间,枚举切点k, 可以得出f[i][j] = min{dp(i, k) + dp(k, j) ...

  4. UVA 10003 区间DP

    这个题目蛮有新意的,一度导致我没看透他是区间DP 给一个0-L长度的木板,然后给N个数,表示0-L之间的某个刻度,最后要用刀把每个刻度都切一下 使其断开,然后每次分裂的cost是分裂前的木板的长度.求 ...

  5. uva 10891 区间dp+记忆化搜索

    https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...

  6. UVA 10891 区间DP+博弈思想

    很明显带有博弈的味道.让A-B最大,由于双方都采用最佳策略,在博弈中有一个要求时,让一方的值尽量大.而且由于是序列,所以很容易想到状态dp[i][j],表示序列从i到j.结合博弈中的思想,表示初始状态 ...

  7. 紫书 例题 9-10 UVa 1626 (区间dp + 输出技巧)

    当前区间f(i, j)分两种情况,一种是s[i]于s[j]符合要求,那么可以转移到f[i + 1][j - 1] 这样答案只会更小或者相等 第二种是直接分成两个部分, 即f[i][j] = f[i][ ...

  8. Uva 10891 经典博弈区间DP

    经典博弈区间DP 题目链接:https://uva.onlinejudge.org/external/108/p10891.pdf 题意: 给定n个数字,A和B可以从这串数字的两端任意选数字,一次只能 ...

  9. 区间DP+next求循环节 uva 6876

    // 区间DP+next求循环节 uva 6876 // 题意:化简字符串 并表示出来 // 思路:dp[i][j]表示 i到j的最小长度 // 分成两部分 再求一个循环节 #include < ...

随机推荐

  1. 译:Java 中的正则表达式性能概述

    原文链接:https://www.baeldung.com/java-regex-performance 作者: baeldung 译者:Darren Luo 1. 概述 在本快速教程中,我们将展示模 ...

  2. go实现主线程等待子线程都运行完再退出

    方式一 package main import ( "fmt" ) func main() { ch := make(chan struct{}) count := 2 // co ...

  3. 把一个HashMap的值全部取出来,放到两个数组中

    先是从数据库中获取所有的值,返回一个HashMap类型的数据: <pre name="code" class="java"> private Has ...

  4. Vue.js之vue-router路由

    vue学习的一系列,全部来自于表哥---表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 1概述 vue-r ...

  5. [opencv bug] orb flannBaseMatcher Exception

    when i use flannBaseMathcer to match 2 sets of orb descriptor, it occured an exception : unsigned lo ...

  6. selenium3+webdriver学习笔记1(访问常用请求)

    #!/usr/bin/env python# -*- coding:utf-8 -*- from selenium import webdriverimport osimport time url1= ...

  7. POJ 3311 Hie with the Pie (状压DP)

    题意: 每个点都可以走多次的TSP问题:有n个点(n<=11),从点1出发,经过其他所有点至少1次,并回到原点1,使得路程最短是多少? 思路: 同HDU 5418 VICTOR AND WORL ...

  8. CPP-基础:extern"C"

    简介:extern "C" 包含双重含义,从字面上即可得到:首先,被它修饰的目标是“extern”的:其次,被它修饰的目标是“C”的.让我们来详细解读这两重含义. 含义: 1.被e ...

  9. OO第三次电梯作业优化

    目录 第三次电梯作业个人优化 前言 优化思路 一.调度器 二.电梯 第三次电梯作业个人优化 前言 由于个人能力有限,第二次电梯作业只能完成正确性设计,没能进行优化,也因此损失了强测分数,于是第三次电梯 ...

  10. GTA5(侠盗猎车5)中文版破解版

    )中文版破解版迅雷下载地址(使用迅雷新建任务填上地址): magnet:?xt=urn:btih:65F16B126D8A656E4FC825DE204EBFAF04B070FC