题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2476

题目大意:

给出两个等长的串S, T, 要将S变成T, 每次可以把S的连续的一段变成相同的字母,求最少操作数。

这题网上看了好多题解,理解了好久, 记录一下我的理解吧。

首先求出把空串变成T的最少次数。

dp[i][j] 表示把空串变成T[i ... j]的最少次数。

首先dp[i][j] = dp[i + 1][j].

然后有一个性质。如果两次染色的区间有交, 那么小的区间一定完全包含于大的区间(左右端点也不会重合), 且一定是大区间 在小区间之前染色(否则 小区间完全被覆盖 就没用了)。

如果不是这样, 可以改造一下区间 变成这样。

所以第一次染色 一定是[i, k],   然后T[k + 1, j]可以单独考虑(因为染色不能再和[i, k]有交了)。

那么如何选这个k呢?

只要考虑T[i] = T[k]的位置, 如果不是,可以调整染色区域长度 变成右端点的颜色和 T[i]一样。

然后有另外一个性质:

如果T[i] = T[j], dp[i][j] = dp[i + 1][j].    只要第一次染色区域选择[i, j],  就可以和dp[i + 1][j] 对应起来。

综上 dp[i][j] = min{dp[i + 1][j] + 1,    dp[i + 1][k]  + dp[k][j] (T[i] == T[k]) }

最后根据dp数组再做一次DP。

ans[i] 表示考虑S[1 ... i]  T[1 ... i]

如果S[i] == T[i]  显然ans[i] = ans[i - 1]

否则肯定有一段S的区间[k ... i]  都被刷子刷过。  那么这一段的情况就是dp[k][i].

所以ans[i] = min(ans[k] + dp[k + 1][i]).

代码:

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
#include <map>
#include <queue>
#include <set>
using namespace std; #define X first
#define Y second
#define N 110
#define M 500010 typedef long long ll;
const int INF = << ;
const int Mod = ; char s[N], t[N];
int dp[N][N], ans[N]; int main()
{
//freopen("in.in", "r", stdin);
//freopen("out.out", "w", stdout); while (scanf("%s %s", s + , t + ) != EOF)
{
int n = strlen(s + );
for (int i = ; i <= n; ++i) dp[i][i] = ;
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 (t[i] == t[k]) dp[i][j] = min(dp[i][j], dp[i + ][k] + dp[k + ][j]);
}
}
ans[] = (s[] != t[]);
for (int i = ; i <= n; ++i)
{
if (s[i] == t[i]) ans[i] = ans[i - ];
else
{
ans[i] = dp[][i];
for (int k = ; k < i; ++k)
ans[i] = min(ans[i], ans[k] + dp[k + ][i]);
}
}
printf("%d\n", ans[n]);
} return ;
}

String painter (hdu 2476 DP好题)的更多相关文章

  1. String painter HDU - 2476 -区间DP

    HDU - 2476 思路:分解问题,先考虑从一个空串染色成 B串的最小花费 ,区间DP可以解决这个问题 具体的就是,当 str [ l ] = = str [ r ]时 dp [ L ] [ R ] ...

  2. HDU 2476 String painter(区间DP)

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

  3. HDOJ 题目2474 String painter(区间DP)

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

  4. String painter(区间DP)

    There are two strings A and B with equal length. Both strings are made up of lower case letters. Now ...

  5. String painter (区间dp)

    There are two strings A and B with equal length. Both strings are made up of lower case letters. Now ...

  6. HDU 2476 String painter (区间DP)

    题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...

  7. hdu 2845(dp基础题)

    题意:容易理解. 分析:以后碰到这种类型的题,就要考虑把矩阵先按行来处理,再按列处理.先算出每行能够能够得到的最大值,然后按列处理即可. 代码实现: #include<stdio.h> # ...

  8. You Are Given a Decimal String... CodeForces - 1202B [简单dp][补题]

    补一下codeforces前天教育场的题.当时只A了一道题. 大致题意: 定义一个x - y - counter :是一个加法计数器.初始值为0,之后可以任意选择+x或者+y而我们由每次累加结果的最后 ...

  9. UVALive 4394 String painter ——(区间DP)

    其实这个dp过程有点似懂非懂...代码如下: #include <stdio.h> #include <algorithm> #include <string.h> ...

随机推荐

  1. 【转】C语言中不同的结构体类型的指针间的强制转换详解

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

  2. java写的小脚本,用来受mDNS消息

    太ugly了,但是可以工作,抓了包下来,用前面DNS message structure做了下比较. 代码如下: import java.net.DatagramPacket; import java ...

  3. Choose which tree,form view in many2one

    <field name="partner_id" context="{'ref_form_view': 'view_id_of_my_form','ref_tree ...

  4. Drupal启动阶段之二:页面缓存

    页面缓存是什么意思?有些页面浏览量非常大,而且与状态无关,这类页面就可以使用页面缓存技术.在页面第一次请求完毕以后,将响应结果保存起来.下一次再请求同一页面时,就不需要从头到尾再执行一遍,只需要将第一 ...

  5. hdu 4770 Lights Against Dudely(回溯)

    pid=4770" target="_blank" style="">题目链接:hdu 4770 Lights Against Dudely 题 ...

  6. 【HDOJ 5379】 Mahjong tree

    [HDOJ 5379] Mahjong tree 往一颗树上标号 要求同一父亲节点的节点们标号连续 同一子树的节点们标号连续 问一共同拥有几种标法 画了一画 发现标号有二叉树的感觉 初始标号1~n 根 ...

  7. php漏洞修复 禁用函数

    别人利用此PHP函数可以对系统进行相关操作 1.打开php.ini找到 ; http://php.net/disable-functions 2.修改添加内容如下 disable_functions ...

  8. Mac OS 下安装mysql环境

    传送门:Mac下安装与配置MySQL   mac 上怎么重置mysql的root的密码? 一.下载mysql 进入官方下载地址:https://www.mysql.com/downloads/ 1.找 ...

  9. C 语言 ioctl

    /* *@author cody *@date 2014-08-12 *@description */ /* #include <sys/ioctl.h> send control and ...

  10. 调试JDK1.8源码的方法

    背景 在学习JDK源码的时候,免不了需要调试JDK的源码. 比如:想理解ConcurrentHashMap的put(K k, V v)方法,JDK自带的rt.jar文件是支持断点调试,但是却看不到变量 ...