本文出自:http://blog.csdn.net/dr5459

题目地址:

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4097

题目意思:

以下内容出自http://blog.csdn.net/shuangde800/article/details/9885147

我是按照他的想法,算法是自己实现的

给一个字符串,可以把连续相同的部分进行缩写成k(S)的形式,S是一个字符串,k表示有连续相同的S

例如,abgogogogo,可以缩写成ab4(go). 还可以嵌套缩写,比如

“nowletsgogogoletsgogogo”, 缩写成“now2(lets3(go))”

思路:

一道区间dp,但是这题并不好想
f(i, j)表示字符串的i~j位的最小位数
那么
f(i, j) = min{
                  min{ f(i,k)+f(k+1, j), i<=k<j },
                  min{ digitNum(k)+f[l][l+k-1]+2, 如果字符串可以由前k个字符串重复组成的 }
                }
digitNum(k)表示数字k的位数
判断区间(i, j)是否有由连续k个组成的字符串连续组成的,直接用O(n)的时间判断

区间DP用记忆画搜索比较容易实现,不用仔细去想迭代的写法

所以以后写区间DP就可以用记忆化搜索的写法

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string.h> using namespace std; const int maxn = 300;
int dp[maxn][maxn];
char s[maxn];
const int INF = 0x3f3f3f3f; bool check(int l,int r,int k)
{
int i;
int len = r-l+1;
i=0;
while(i<k)
{
int p;
for(p=1;l+p*k+i<=r;p++)
{
if(s[l+i] != s[l+p*k+i])
return false;
}
i++;
} return true;
} int min(int a,int b)
{
return a<b?a:b;
} int digitnum(int k)
{
int len = 0;
while(k>0)
{
len++;
k/=10;
}
return len;
} int DP(int l,int r)
{
if(dp[l][r] != -1)
return dp[l][r]; int len = r-l+1;
int d; dp[l][r] = INF; for(int k=l;k<r;k++)
dp[l][r] = min(dp[l][r],DP(l,k)+DP(k+1,r)); for(d=1;d<=len/2;d++)
{
if(len%d != 0)
continue;
if(check(l,r,d))
{
dp[l][r] = min(dp[l][r],digitnum(len/d)+DP(l,l+d-1)+2);
}
} return dp[l][r];
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
memset(dp,-1,sizeof(dp));
int len = strlen(s);
int i;
for(i=0;i<len;i++)
dp[i][i] = 1;
cout<<DP(0,len-1)<<endl;
}
return 0;
}

UVA1351-----String Compression-----区间DP(记忆化搜索实现)的更多相关文章

  1. (区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)

    http://poj.org/problem?id=3186   Description FJ has purchased N (1 <= N <= 2000) yummy treats ...

  2. UVA 10003 Cutting Sticks 区间DP+记忆化搜索

    UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...

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

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

  4. loj 1031(区间dp+记忆化搜索)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了. ...

  5. Ural 1183 Brackets Sequence(区间DP+记忆化搜索)

    题目地址:Ural 1183 最终把这题给A了.. .拖拉了好长时间,.. 自己想还是想不出来,正好紫书上有这题. d[i][j]为输入序列从下标i到下标j最少须要加多少括号才干成为合法序列.0< ...

  6. BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】

    题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...

  7. HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索

    题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析:  枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...

  8. hdu 4597 Play Game(区间dp,记忆化搜索)

    Problem Description Alice and Bob are playing a game. There are two piles of cards. There are N card ...

  9. poj 1088 滑雪(区间dp+记忆化搜索)

    题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...

  10. 洛谷1880 区间dp+记忆化搜索 合并石子

    题目网址:https://www.luogu.com.cn/problem/P1880 题意是:给定一个序列,最小规则是相邻两个值的合并,开销是他们的和,将整个序列合并成一个值的情况下,求解该值的最小 ...

随机推荐

  1. 【转】unity3d的常用快捷键

    Unity3D默认的快捷键. shift +方向键             向“向方向键前进” Windows系统Unity3D中的快捷键 组合键 键 功能 File 文件 Ctrl   N New ...

  2. struts2中的方法过滤拦截器

    方法过滤拦截器是只过滤指定的方法,如果使用针对action 的普通的过滤器则会过滤该action内部 所有方法.如果在一个action中同时有多个作为业务逻辑控制的方法存在 的话则会过滤所有的业务逻辑 ...

  3. Springmvc加载静态文件和开启EL表达式的支持

    一.静态文件加载问题 刚开始学习SpringMVC,发现静态文件无法加载 web.xml配置如下: <web-app id="WebApp_ID" version=" ...

  4. java版括号匹配检测

    做一个空栈,读入字符直到结尾.如果读入一个封闭符号,空栈时报错;非空时弹出栈尾字符,如果不匹配则报错.否则读入为开放字符,压入栈中.最后如果栈空,返回true. 其中用到MyStack类,详情请见 p ...

  5. [Django 1.5] Windows + Apache + wsgi配置

    基本步骤 下载安装Apache http://httpd.apache.org/download.cgi. 下载安装modwsgi 模块http://code.google.com/p/modwsgi ...

  6. poj3077---进位

    #include <stdio.h> #include <stdlib.h> #include<string.h> ]; ]; int main() { int n ...

  7. get the first and last collection item in Magento

    $product_collection->getFirstItem() $product_collection->getLastItem()

  8. C#.NET学习笔记7--11---算术运算符,变量赋值,变量的交换,布尔表达式1,布尔表达式2

    C#.NET学习笔记7---算术运算符 2013/9/6 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com 1.Consol ...

  9. javascript高级知识点——指定上下文实现

    代码信息来自于http://ejohn.org/apps/learn/. 当我们将一个对象的点击事件绑定到一个事件触发元素时会发生什么? <ul id="results"&g ...

  10. CentOS7与Win7双系统引导问题

    先安装的Win7,后安装的CentOS7,结果系统引导就只有CentOS7了.记得以前CentOS6.x系列没这个问题,主要是由于CentOS7.x使用grub2的原因吧. 方案一:使用Win PE. ...