题目

String painter

给出两个字符串s1,s2。对于每次操作可以将 s1 串中的任意一个子段变成另一个字符。问最少需要多少步操作能将s1串变为s2串。

解析

太妙了这个题,mark一下。

这个题先考虑怎么由空串转化s2,

\(f[i][j]\)表示从空串到s2最少的次数,

则有\(f[i][j]=s[i+1][j]+1\),

若\([i+1,j]\)存在一个\(k\),使\(s2[i]==s2[k]\),则\(f[i][j]=min\{f[i+1][k]+f[k+1][j]\}\),

\(k\)为断点,\(i\)和\(k\)同时刷。

然后再考虑把s1刷成s2的代价

设\(sum[i]\)表示把\(s1[1,i]\)刷成\(s2[1,i]\)的次数

当\(s1[i]==s2[i]\)时,可以不刷,显然\(sum[i]=sum[i-1]\)

否则,在区间内找最小次数\(sum[i]=min\{sum[j]+f[j+1][i]\}\)

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10; int n, m; int f[N][N], sum[N]; char s[N], t[N]; int main() {
while (cin >> s) {
cin >> t;
memset(f, 0, sizeof f);
memset(sum, 0, sizeof sum);
int len = strlen(s);
for (int i = 0; i < len; ++i) f[i][i] = 1;
for (int i = 0; i < len; ++i)
for (int j = i - 1; j >= 0; --j) {
f[j][i] = f[j + 1][i] + 1;
for (int k = j + 1; k <= i; ++k) if (t[j] == t[k])
f[j][i] = min(f[j][i], f[j + 1][k] + f[k + 1][i]);
}
for (int i = 0; i < len; ++i) sum[i] = f[0][i];
if (s[0] == t[0]) sum[0] = 0;
for (int i = 1; i < len; ++i) {
if (s[i] == t[i]) sum[i] = min(sum[i], sum[i - 1]);
else for (int j = 0; j < i; ++j) sum[i] = min(sum[i], sum[j] + f[j + 1][i]);
}
cout << sum[len - 1] << endl;
}
}

HDU2476 String painter(DP)的更多相关文章

  1. HDU2476 String painter —— 区间DP

    题目链接:https://vjudge.net/problem/HDU-2476 String painter Time Limit: 5000/2000 MS (Java/Others)    Me ...

  2. hdu2476 String painter(区间dp)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=2476 Problem Description There are two strings ...

  3. HDU2476 String painter

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

  4. HDU2476 String painter——区间DP

    题意:要把a串变成b串,每操作一次,可以使a串的[l,r]区间变为相同的一个字符.问把a变成b最少操作几次. 这题写法明显是区间dp ,关键是处理的方法. dp[l][r]表示b串的l~r区段至少需要 ...

  5. ACM学习历程—HDU2476 String painter(动态规划)

    http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意是给定一个起始串和一个目标串,然后每次可以将某一段区间染成一种字符,问从起始串到目标串最少需要染多 ...

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

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

  7. uva live 4394 String painter 间隔dp

    // uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...

  8. HDU 2476 String painter(区间DP)

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

  9. String painter(区间DP)

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

随机推荐

  1. 深入SaltStack

    [译者注] 这是一篇发表在opencredo官网的博文,通过比较流行的Puppet和新发展起来的Salt,详细地介绍了Salt的功能.在征得原作者的同意后,翻译出来,与大家分享.初次翻译长文,请大家指 ...

  2. win10教育版永久激活密钥 win10教育版激活码 win10教育版产品密钥2018(第三种方法亲测可用!)

    有没有最新win10教育版激活密钥?win10教育版功能比较全面,增加了一些学术上需要的功能.有用户装了win10教育版,提示需要产品密钥,网上找到的win10教育版永久激活码大多失效,这边小编为大家 ...

  3. XML-Signature 语法和签名

    一段  XML-signature  的 demo: <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> &l ...

  4. 美化自己的loading框

    美化自己的loading框 ._showloading { position: absolute; left:; width: 100%; height: 100%; top:; background ...

  5. J-CUBE Appears at AVATAR Xprize at Geneva 2019

    2019年5月27日,瑞士日内瓦,Avatar Xprize发布会隆重举行.非常荣幸的是,J-CUBE也受邀参加此次大会. 关于Avatar Xprize项目的介绍 https://avatar.xp ...

  6. python初级(302) 6 对象(四)

    一.复习 1.什么是多态 2.复习上一节课内容 class Triangle: """ 三角形类 """ def __init__(self ...

  7. if [ $? -eq 0 ]的含义

    if [ $? -eq 0 ]语句代表上一个命令执行后的退出状态 $0: shell或shell脚本的名字$*: 以一对双引号给出参数列表$@:   将各个参数分别加双引号返回$#:       参数 ...

  8. SAP翔子_ABAP_DEMO篇索引

    序号 描述 SAP翔子_ABAP_DEMO篇1 ABAP DEMO篇1 单层反查BOM SAP翔子_ABAP_DEMO篇2 ABAP DEMO篇2 删除工艺路线 SAP翔子_ABAP_DEMO篇3 A ...

  9. Centos7中rc.local设置springboot项目开机自启动

    在Centos7下,rc.local文件,开机默认是不执行的 1.进入rc.local中 路径如下图

  10. 使用powercli创建模板与克隆虚机

    用powercli练练手,需从实际案例出发,本节将使用powercli写两个demo,一个是创建模板,并根据模板创建新的虚机:另一个demo是克隆虚机. [注意] 1.创建模板与克隆操作只能在vcen ...