UVA1351-----String Compression-----区间DP(记忆化搜索实现)
本文出自: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(记忆化搜索实现)的更多相关文章
- (区间dp + 记忆化搜索)Treats for the Cows (POJ 3186)
http://poj.org/problem?id=3186 Description FJ has purchased N (1 <= N <= 2000) yummy treats ...
- UVA 10003 Cutting Sticks 区间DP+记忆化搜索
UVA 10003 Cutting Sticks+区间DP 纵有疾风起 题目大意 有一个长为L的木棍,木棍中间有n个切点.每次切割的费用为当前木棍的长度.求切割木棍的最小费用 输入输出 第一行是木棍的 ...
- uva 10891 区间dp+记忆化搜索
https://vjudge.net/problem/UVA-10891 给定一个序列x,A和B依次取数,规则是每次只能从头或者尾部取走若干个数,A和B采取的策略使得自己取出的数尽量和最大,A是先手, ...
- loj 1031(区间dp+记忆化搜索)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1031 思路:dp[i][j]表示从区间i-j中能取得的最大值,然后就是枚举分割点了. ...
- Ural 1183 Brackets Sequence(区间DP+记忆化搜索)
题目地址:Ural 1183 最终把这题给A了.. .拖拉了好长时间,.. 自己想还是想不出来,正好紫书上有这题. d[i][j]为输入序列从下标i到下标j最少须要加多少括号才干成为合法序列.0< ...
- BZOJ1055[HAOI2008]玩具取名 【区间dp + 记忆化搜索】
题目 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够 ...
- HDU 2517 / POJ 1191 棋盘分割 区间DP / 记忆化搜索
题目链接: 黑书 P116 HDU 2157 棋盘分割 POJ 1191 棋盘分割 分析: 枚举所有可能的切割方法. 但如果用递归的方法要加上记忆搜索, 不能会超时... 代码: #include& ...
- hdu 4597 Play Game(区间dp,记忆化搜索)
Problem Description Alice and Bob are playing a game. There are two piles of cards. There are N card ...
- poj 1088 滑雪(区间dp+记忆化搜索)
题目链接:http://poj.org/problem?id=1088 思路分析: 1>状态定义:状态dp[i][j]表示在位置map[i][j]可以滑雪的最长区域长度: 2>状态转移方程 ...
- 洛谷1880 区间dp+记忆化搜索 合并石子
题目网址:https://www.luogu.com.cn/problem/P1880 题意是:给定一个序列,最小规则是相邻两个值的合并,开销是他们的和,将整个序列合并成一个值的情况下,求解该值的最小 ...
随机推荐
- JavaScript总结之鼠标划过弹出div单击出现对话框
为了满足他们的永无止境的要求,我可谓是任劳任怨啊,累断了双手,看瞎了双眼.这个是来写鼠标划过一个按钮,然后弹出一个小提示框解释,另外根据radio是否选中,判断点击后如何执行,然后执行之后再有一个确认 ...
- jquery ajax提交及请求
jQuery.ajax({ url: dataURL, success: function(results) { var parsedJson = jQuery.parseJSON(results); ...
- css中element element和element>element选择器的区别
就是这样的选择器: 比如html中有这样一段布局: <div> <p>我是一个段落</p> </div> 这时你用div p{background:ye ...
- JQuery DataTables Editor---只修改页面内容
近来在工作中需要对JQuery DataTables进行增,删,改的操作,在网上找了一些资料,感觉比较的好的就是(http://editor.datatables.net/)文章中所展示的操作方法(如 ...
- 给flash文件加超链接[兼容主流浏览器]
<div style="position: relative;"> <a style="width: 640px; height: 90px; posi ...
- 有趣的keil MDK细节
1.MDK中的char类型的取值范围是? 在MDK中,默认情况下,char 类型的数据项是无符号的,所以它的取值范围是0-255.它们可以显式地声明为signed char 或 unsigned.因此 ...
- overload的一点思考
仅参数类型不同的重载方法,使用过程的一个困惑: 有没有必要使用instanceof方法? package overload.special; public class OverLoadTest { p ...
- mysql_healthly
cat mysql_healthly.php <?php if (!defined('IN_PDK')){ define('IN_PDK', true); } $db_name = $_GET[ ...
- Design Pattern Iterator 迭代器设计模式
这个设计模式感觉很easy,我们平时敲代码的时候也是常常须要调用iterator的,C++和Java都是. 所以感觉没什么特别的.就是须要模仿C++或者Java的iterator类的功能吧. 这里简单 ...
- Twitter 新一代流处理利器——Heron 论文笔记之Heron架构
Twitter 新一代流处理利器--Heron 论文笔记之Heron架构 标签(空格分隔): Streaming-process realtime-process Heron Architecture ...