题目大意:

给你两个串,有一个操作! 操作时可以把某个区间(L,R) 之间的所有字符变成同一个字符。现在给你两个串A,B要求最少的步骤把A串变成B串。
题目分析:
区间DP, 假如我们直接想把A变成B,那么我们DP区间的时候容易产生一个问题:假如我这个区间更新了,那么之前这个区间的子区间内DP出来的值就没用。
然后考虑到这里一直想不过去。最后看了看题解才知道.
我们可以先预处理一下怎么将一个空串变成B串需要的操作数。
这样我们就不用考虑子区间被覆盖的情况了。
如区间L,R
我们需要考虑的是点L是否需要单独刷一次。
如果需要单独刷一次那么就是:dp[L][R] = dp[L+1][R] + 1;
如果不需要单独刷,那么就是从一个点k刷到点L的时候顺便把L给刷掉。
那么我们就不用再占用刷的次数了。
 
故:if(b[L] == b[k])  dp[L][R] = min(dp[L][R], dp[L+1][k] + dp[k+1][R]);
因此我们dp[L][R] 保存的就是最小刷的次数了。
然后下面我们把答案枚举一下就行了。
 
============================================================================================
记忆化搜索
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL INF = 0xfffffff;
const LL maxn = ;
int dp[maxn][maxn], ans[maxn];
char a[maxn], b[maxn];
int DFS(int L,int R)
{
if(dp[L][R])
return dp[L][R];
if(L == R)
return dp[L][R] = ;
if(L > R)
return ;
dp[L][R] = DFS(L+,R) + ;
for(int k=L+; k<=R; k++)
{
if(b[L] == b[k])
dp[L][R] = min(dp[L][R], DFS(L+,k) + DFS(k+,R) );
}
return dp[L][R];
} int main()
{ while(cin >> a >> b)
{
memset(dp, , sizeof(dp));
int n = strlen(a);
for(int i=; i<n; i++)
DFS(, i); for(int i=; i <n; i++)
{
ans[i] = dp[][i];
if(a[i] == b[i])
ans[i] =i?ans[i-]:; for(int j=; j<i; j++)
ans[i] = min(ans[i], ans[j]+dp[j+][i]);
}
printf("%d\n", ans[n-]);
}
return ;
}

=========================================================================

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
const LL INF = 0xfffffff;
const LL maxn = ;
int dp[maxn][maxn], ans[maxn];
char a[maxn], b[maxn]; int main()
{ while(cin >> a >> b)
{
memset(dp, , sizeof(dp));
int n = strlen(a); for(int len=; len<n; len++)
{
for(int i=; i+len<n; i++)
{
int j = i + len;
dp[i][j] = dp[i+][j] + ;
for(int k=i+; k<=j; k++)
{
if(b[i] == b[k])
{
dp[i][j] = min(dp[i][j], dp[i+][k] + dp[k+][j]);
}
}
}
} for(int i=; i <n; i++)
{
ans[i] = dp[][i];
if(a[i] == b[i])
ans[i] =i?ans[i-]:; for(int j=; j<i; j++)
ans[i] = min(ans[i], ans[j]+dp[j+][i]);
}
printf("%d\n", ans[n-]);
}
return ;
}

HDU 2476 String painter(记忆化搜索, DP)的更多相关文章

  1. hdu 2476 (string painter) ( 字符串刷子 区间DP)

    String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  2. 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence

    题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...

  3. HDU 4597 Play Game (记忆化搜索博弈DP)

    题意 给出2*n个数,分两列放置,每列n个,现在alice和bob两个人依次从任意一列的对头或队尾哪一个数,alice先拿,且两个人都想拿最多,问alice最后能拿到数字总和的最大值是多少. 思路 4 ...

  4. HDU 1078 FatMouse and Cheese 记忆化搜索DP

    直接爆搜肯定超时,除非你加了某种凡人不能想出来的剪枝...555 因为老鼠的路径上的点满足是递增的,所以满足一定的拓补关系,可以利用动态规划求解 但是复杂的拓补关系无法简单的用循环实现,所以直接采取记 ...

  5. HDU - 6415 多校9 Rikka with Nash Equilibrium(纳什均衡+记忆化搜索/dp)

    Rikka with Nash Equilibrium Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/524288 K ...

  6. hdu 4960 记忆化搜索 DP

    Another OCD Patient Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Ot ...

  7. [HDU 1428]--漫步校园(记忆化搜索)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1428 漫步校园 Time Limit: 2000/1000 MS (Java/Others)    M ...

  8. HDU 4597 Play Game(记忆化搜索,深搜)

    题目 //传说中的记忆化搜索,好吧,就是用深搜//多做题吧,,这个解法是搜来的,蛮好理解的 //题目大意:给出两堆牌,只能从最上和最下取,然后两个人轮流取,都按照自己最优的策略,//问说第一个人对多的 ...

  9. 记忆化搜索 dp学习~2

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 Function Run Fun Time Limit: 2000/1000 MS (Java/ ...

随机推荐

  1. linux-3.0下input_dev模型按键驱动

    该代码在FL2440开发板上测试通过,为方便教学,将驱动中的platform_device和platform_driver故意分为两个驱动模块. [guowenxue@centos6 input_kb ...

  2. Linux 目录与文件的基本操作

    1 目录与文件 1.1 文件 硬盘中的数据在操作系统中的体现为文件. 1.2 目录 目录的概念不是文件集合.目录和文件一样,目录也是文件.目录是找到文件的“踏板”.目录的本质是路径映射. 1.3 Li ...

  3. python版本简历

  4. alpha属性设置

    alpha是来设置透明度的,它的基本属性是filter:alpha(opacity,finishopacity,style,startX,startY,finishX,finishY).opacity ...

  5. 知识点摸清 - - function()——JavaScript 函数名后什么时候加括号,什么时候不

    加括号——调用函数 只要是要调用函数执行的,都必须加括号. 此时,function()实际上等于函数的返回值.(没有返回值也已经执行了函数体内的行为).就是说,只要加括号的,就代表将会执行函数体代码. ...

  6. Unity3D 创建一个简单的2D游戏

    开始研究Unity3d 中的2D游戏. 首先创建出一个项目: 然后创建出一个场景: 然后添加一个背景: 然后创建一个主人公对象: 可以是自己做的素材,也可以是用unity裁剪的素材, 下面贴出裁剪素材 ...

  7. HTML5 文件处理之FileAPI简介整理

    在众多HTML5规范中,有一部分规范是跟文件处理有关的,在早期的浏览器技术中,处理小量字符串是js最擅长的处理之一.但文件处理,尤其是二进制文件处理,一直是个空白.在一些情况下,我们不得不通过Flas ...

  8. linux指令备份

    ls -a 显示隐藏文件 cd 回到当前用户的目录 /home/ubuntu touch 创建文件 cat Hello.javamore/less Hello.java分页显示 grep root / ...

  9. cetos 6.3 安装 apache+mysql+php

      1.安装 apache 服务器 yum install httpd 启动服务 service httpd start or /etc/init.d/httpd start 2.安装 mysql 数 ...

  10. 自动化工具word文档批量转html

    企业有很多的科室,科室的每个人或多或少都会写一些文档,有些文档领导需要浏览,解决的办法是将编辑的文档打印出来,供领导浏览,或是为了节约企业成本,文档就在人与人这间或部门之间copy过来,copy过去. ...