题目大意:

给你两个串,有一个操作! 操作时可以把某个区间(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. 第一篇、Apache和Tomcat的整合

    1.web架构 首先上图,解释web通用架构 通常情况下分为三大块 : ★ Web server :  通常情况下由 Apache Http Server  . IBM Http Server  .I ...

  2. C#中的Dictionary字典类介绍

      Dictionary字典类介绍 必须包含名空间System.Collection.Generic    Dictionary里面的每一个元素都是一个键值对(由二个元素组成:键和值)    键必须是 ...

  3. Linux通配符

    * 任意字符 ?任意单个字符 [] 匹配指定 字符范围内的字符 [^] 指定范围之外的单个字符 常规字符集合 [a-z] a到z的所有小写字母 [A-Z] a到z的所有大写字母 [0-9] 0到9的所 ...

  4. SpringMVC4+thymeleaf3的一个简单实例(篇一:基本环境)

    首语:用SpringMVC和thymeleaf实现一个简单的应用,包括基本环境搭建,SpringMVC4和thymeleaf3的整合,页面参数的获取,页面参数验证,以及用MySQL保存数据.我会把步骤 ...

  5. ZOJ 刷题记录 小黑屋 (`・д・´)

    P1006:模拟 然而我的同余方程能过样例然而就是WA⊙﹏⊙b [已查明:扩展欧几里得算法出了很隐蔽的问题] int exGcd(int x,int y,int& a,int& b) ...

  6. Become a Windows Insider and Test New Windows 10 Features

    SR: To write an Edge browser extension. Microsoft is releasing Windows 10 build 14291 with browser e ...

  7. Bootstrap_Javascript_弹窗

    一. 结构分析 Bootstrap框架中的模态弹出框,分别运用了“modal”.“modal-dialog”和“modal-content”样式,而弹出窗真正的内容都放置在“modal-content ...

  8. HTML5-黑客帝国2D

    <!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>& ...

  9. javascript删除目标div tr 等

    var delTr = document.getElementById("要删除的位置"); // 获取要删除的位置”对象“ delTr.parentNode.removeChil ...

  10. PHP: 使用CURL访问FTP

    今天要做FTP上传.本想用PHP自带的FTP函数来实现,结果发现这个模块没有编译进来,重新编译PHP太麻烦,改用其他方式实现吧  FTP上传 if (isset($_POST['Submit'])) ...