题目大意:

给你两个串,有一个操作! 操作时可以把某个区间(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. iOS获取健康步数从加速计到healthkit

    计步模块接触了一年多,最近又改需求了,所以又换了全新的统计步数的方法,整理一下吧. 在iPhone5s以前机型因为没有陀螺仪的存在,所以需要用加速度传感器来采集加速度值信息,然后根据震动幅度让其加入踩 ...

  2. c读mysql产生乱码问题

    在编写接口API时,发现中文字utf8输入的在linux下采用c读取显示为”??”问号,这是由于编码造成的. 很简单的两个地方做修改就搞定. 1.先找到mysql的my.cnf配置文件/etc/my. ...

  3. 表单提交对chrome记住密码的影响

    在处理注册.登录等含有用户名,密码的元素的表单时,chrome会主动的提示记住密码,然而这个功能在用户名的选择上真是耐人寻味,它总是寻找离password input控件最近的那一个文本框的内容,作为 ...

  4. C# 异步操作

    在程序中,普通的方法是单线程的.但中途如果有大型的操作,比如读取大文件,大批量操作数据库,网络传输等,都会导致程序阻塞,表现在界面上就是程序卡或者死掉,界面元素不动了,不响应了.C#异步调用很好的解决 ...

  5. 初识sass框架

    编写过页面的开发者都知道css这个东西,究其原意,也就是层叠样式表,我们页面的三大结构,html css javascript,其中html负责主要的页面结构,css就负责主要的页面样式,而我们的js ...

  6. javascript——函数属性和方法

    <script type="text/javascript"> //每个函数都包含两个属性:length 和 prototype //length:当前函数希望接受的命 ...

  7. 基于jQuery选择器的整理集合

    jquery对象访问1.each(callback):以每个匹配的元素作为上下文来执行一个函数,return false;停止循环;return true;跳至下一个循环. 来个实例 : 代码如下: ...

  8. SQL服务器名称的更改

    SQL服务器名称的更改   1.使用select @@ServerName可以看到当前数据库的服务器名称 2.从Sys.SysServers表中可以看到当前的所有服务器名称 3.使用 sp_drops ...

  9. Mvvm绑定datagrid或listview的selectItems的方法[转]

    单选,很简单,将SelectedItem与ViewModel的属性进行双向绑定就OK了 多选,由于ListView的SelectedItems不能进行绑定,需要将ListView的SelectionC ...

  10. python之正则表达式备忘

    一简介:就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C ...