题目链接 字符串折叠

区间DP。$f[l][r]$为字符串在区间l到r的最小值

正常情况下 $f[l][r] = min(f[l][r], f[l][l+k-1]+f[l+k][r]);$

当$l$到$r$以$k$为周期时 $f[l][r] = min(f[l][r], 2+sz(k)+f[l][l+(r-l+1)/k-1]);$

判重的时候为了方便我用了哈希……当然其他方法应该也是可以的~

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define rep(i, a, b) for (int i(a); i <= (b); ++i)
  6. #define dec(i, a, b) for (int i(a); i >= (b); --i)
  7.  
  8. typedef unsigned long long LL;
  9.  
  10. const int N = 210;
  11. const int base = 233;
  12.  
  13. int f[N][N], n;
  14. LL bin[N], Hash[N];
  15. char s[N];
  16.  
  17. void Hashtable(){
  18. bin[0] = 1;
  19. rep(i, 1, n) bin[i] = bin[i - 1] * base;
  20. rep(i, 1, n) Hash[i] = Hash[i - 1] * base + s[i];
  21. }
  22.  
  23. inline LL gethash(int l, int r){
  24. return Hash[r] - Hash[l - 1] * bin[r - l + 1];
  25. }
  26.  
  27. inline int sz(int x){
  28. int ret = 0;
  29. for (; x;) ++ret, x /= 10;
  30. return ret;
  31. }
  32.  
  33. inline bool judge(int l, int m, int r){
  34. if ((r - l + 1) % m) return 0;
  35. int t1 = (r - l + 1) / m;
  36. LL t = gethash(l, l + t1 - 1);
  37. for (int i = l; i <= r; i += t1)
  38. if (gethash(i, i + t1 - 1) != t) return 0;
  39. return 1;
  40. }
  41.  
  42. int main(){
  43.  
  44. scanf("%s", s + 1);
  45. n = strlen(s + 1);
  46.  
  47. Hashtable();
  48. rep(i, 1, n){
  49. rep(j, 1, n){
  50. if (j - i + 1 <= n){
  51. int l = j, r = i + j - 1;
  52. f[l][r] = r - l + 1;
  53. rep(k, 1, i){
  54. f[l][r] = min(f[l][r], f[l][l + k - 1] + f[l + k][r]);
  55. if (judge(l, k, r)) f[l][r] = min(f[l][r], 2 + sz(k) + f[l][l + (r - l + 1) / k - 1]);
  56. }
  57. }
  58. }
  59. }
  60.  
  61. printf("%d\n", f[1][n]);
  62. return 0;
  63. }

BZOJ 1090 字符串折叠(Hash + DP)的更多相关文章

  1. BZOJ 1090 字符串折叠(区间DP)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1090 题意:字符串AAAAAAAAAABABABCCD的最短折叠为9(A)3(AB)CC ...

  2. bzoj 1090 字符串折叠

    题目大意: 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.2. X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S)=SSSS…S(X个S). 3. 如果A=A’, B=B’, ...

  3. BZOJ 1090: [SCOI2003]字符串折叠 区间DP

    1090: [SCOI2003]字符串折叠 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  4. 【BZOJ-1090】字符串折叠 区间DP + Hash

    1090: [SCOI2003]字符串折叠 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1127  Solved: 737[Submit][Stat ...

  5. 【BZOJ】1090: [SCOI2003]字符串折叠(dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1090 随便yy一下.. 设f[i,j]表示i-j的最小长度 f[i, j]=min{j-i+1, f ...

  6. [SCOI2003]字符串折叠 (区间DP)

    题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS…S(X个S). 如果A = A’, B = ...

  7. bzoj1090 [SCOI2003]字符串折叠——区间DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1090 区间DP... 代码如下: #include<iostream> #inc ...

  8. B1090 [SCOI2003]字符串折叠 区间dp

    又一道区间dp,和上一篇类似,但是比他简单,这个只有两种转移方法,不是很复杂.直接判断是否为重复的串就行. 题干: Description 折叠的定义如下: . 一个字符串可以看成它自身的折叠.记作S ...

  9. 洛谷P4302 [SCOI2003]字符串折叠(区间dp)

    题意 题目链接 Sol 裸的区间dp. 转移的时候枚举一下断点.然后判断一下区间内的字符串是否循环即可 `cpp #include<bits/stdc++.h> #define Pair ...

随机推荐

  1. archlinux alsa安装,音量设置和音量信息保存

    1,使用前确认安装了alsa-utils sudo pacman -S alsa-utils2,运行alsamixer调试音量 alsamixer左右键选择调哪个,将Master和PCM按“m”解除静 ...

  2. Ukulele 天空之城

  3. 详解css媒体查询

    简介 媒体查询(Media Queries)早在在css2时代就存在,经过css3的洗礼后变得更加强大bootstrap的响应式特性就是从此而来的. 简单的来讲媒体查询是一种用于修饰css何时起作用的 ...

  4. python动态添加属性和方法

    ---恢复内容开始--- python动态添加属性: class Person(object): def __init__(self,newName,newAge): self.name = newN ...

  5. 初识Pyhon之准备环境

    安装成功python的运行环境之后,你可能要迫不及待大展身手了 如果你有一定的语言基础,那么基础这一块儿就可以简单的看看就可以了,但是你是一个编程语言的初学者.不着急,慢慢往下看 打开pycharm创 ...

  6. shell基础学习-难点重点学习

    来自shell13问 -e : 啟用反斜線控制字符的轉換(參考下表) -E:關閉反斜線控制字符的轉換(預設如此) -n : 取消行末之換行符號(與 -e 選項下的 \c 字符同意) 要取消一個变量,在 ...

  7. Educational Codeforces Round 32:E. Maximum Subsequence(Meet-in-the-middle)

    题目链接:E. Maximum Subsequence 用了一个Meet-in-the-middle的技巧,还是第一次用到这个技巧,其实这个技巧和二分很像,主要是在dfs中,如果数量减小一半可以节约很 ...

  8. cs229_part3

    接下来就是最最最重要的一个有监督学习算法了. 支持向量机 问题背景 样本集表示: \[(x,y)\in D, x\in R^n, y\in \{-1,+1\}\] 回到之前的逻辑回归模型中: 逻辑回归 ...

  9. 【MySQL】Got fatal error 1236原因和解决方法

    一 前言  MySQL 的主从复制作为一项高可用特性,用于将主库的数据同步到从库,在维护主从复制数据库集群的时候,作为专职的MySQL DBA,笔者相信大多数人都会遇到“Got fatal error ...

  10. appium+python自动化-adb shell模拟点击事件(input tap)

    前言 appium有时候定位一个元素很难定位到,或者说明明定位到这个元素了,却无法点击,这个时候该怎么办呢? 求助大神是没用的,点击不了就是点击不了,appium不是万能的,这个时候应该转换思路,换其 ...