题目

题意

给出两个字符串 $ s1,s2 $,每次操作可以使一段连续的子串全变成一个字母,问最少多少次操作可以使 $ s1 $ 变为 $ s2 $.

例如 $ zzzzzfzzzzz $,长度为 $ 11 $ ,我们就将下标看做 $ 1~11 $

先将 $ 1-11 $ 刷一次,变成 $ aaaaaaaaaaa $

$ 2-10:abbbbbbbbba $

$ 2-8:abcccccccba $

$ 3-7:abcdddddcba $

$ 4-6:abcdeeedcab $

$ 5:abcdefedcab $

这样就 $ 6 $ 次,变成了 $ s2 $ 串了

第一眼看到这题,我就想到了这个

题意给出一个字符串,要求将一块空白木板刷成指定字符串,问最少操作次数(规则如上

我们可以定义 $ f[i][j] $ 表示从 $ i $ 刷到 $ j $ 的最少操作次数

转移方程

$ f[i][j]=f[i+1][j]+1 $

$ if(s1[i]==s1[k]) f[i][j]=min(f[i][j],f[i+1][j]+f[k+1][j]) $

$ i+1<=k>=j $

代码

#include<bits/stdc++.h>
using namespace std;
char str1[105];
int dp[105][105],ans[105];
int main(){
scanf("%s",str1+1);
int n=strlen(str1+1);
memset(dp,0,sizeof(dp));
for(int j=1;j<=n;++j){//枚举终点
for(int i=j;i;--i){//起点
dp[i][j]=dp[i+1][j]+1;//直接刷
for(int k=i+1;k<=j;++k){
if(str1[i]==str1[k]){//相同就枚举断点
dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
}
}
}
}
printf("%d",dp[1][n]);
return 0;
}

仔细一想我们可以发现如果 $ s1,s2 $ 没有一个相同的字母那么不就是上面那题吗?

我们可以很容易发现,如果有相同字母那么就有可能缩小次数。

我们可以定义 $ f[i][j] $ 意义同上 $ ans[i] $ 表示到第 $ i $ 个字母所需要的最少次数

$ f $ 转移方程同上

$ if(str1[i]==str2[i]) \ ans[i]=ans[i-1] $ 字母相同直接转移

$ else \ ans[i]=min(ans[i],ans[j]+dp[j+1][i]) $ 字母不同考虑改变

$ 1<j<i $

代码

#include<bits/stdc++.h>
using namespace std;
char str1[105];
char str2[105];
int dp[105][105],ans[105];
int main(){
while(~scanf("%s %s",str1+1,str2+1)){
int n=strlen(str1+1);
memset(dp,0,sizeof(dp));
for(int j=1;j<=n;++j){
for(int i=j;i;--i){
dp[i][j]=dp[i+1][j]+1;
for(int k=i+1;k<=j;++k){
if(str2[i]==str2[k]){
dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
}
}
}
}
for(int i=1;i<=n;++i) ans[i]=dp[1][i];
for(int i=1;i<=n;++i){
if(str1[i]==str2[i]) ans[i]=ans[i-1];
else{
for(int j=1;j<i;++j){
ans[i]=min(ans[i],ans[j]+dp[j+1][i]);
}
}
}
printf("%d\n",ans[n]);
}
return 0;
}

hdu 2476 题解的更多相关文章

  1. String painter HDU - 2476 -区间DP

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

  2. String painter (hdu 2476 DP好题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意: 给出两个等长的串S, T, 要将S变成T, 每次可以把S的连续的一段变成相同的字母 ...

  3. HDU 2476 String painter(区间DP+思维)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2476 题目大意:给你字符串A.B,每次操作可以将一段区间刷成任意字符,问最少需要几次操作可以使得字符串 ...

  4. HDU 2476 String painter (区间DP)

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

  5. HDU 2476 String painter(记忆化搜索, DP)

    题目大意: 给你两个串,有一个操作! 操作时可以把某个区间(L,R) 之间的所有字符变成同一个字符.现在给你两个串A,B要求最少的步骤把A串变成B串. 题目分析: 区间DP, 假如我们直接想把A变成B ...

  6. HDU 2023题解分析

    我想说这道题我还没弄明白我错哪了,交了20多遍一直都是Runtime Error,改了N次还是不对,后来搜了一下,说是数组开小了,又把数组开大,还不对,又改发现一个平均值求错,再改,还不对,洗洗睡吧. ...

  7. hdu 2476"String painter"(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给定字符串A,B,每次操作可以将字符串A中区间[ i , j ]的字符变为ch, ...

  8. HDU 2476 String painter(区间DP)

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

  9. 2014年北京网络赛 Instrusive HDU 5040 题解 优先队列

    网赛的时候看了这道题,发现就是平常的那种基础搜索题. 由于加了一个特殊条件:可以一次消耗3秒或原地停留1秒. 那就不能使用简单的队列了,需要使用优先队列才行. 题意 告诉一副地图:一个起点,一个终点, ...

随机推荐

  1. nginx压力测试和并发预估

    一.Nginx并发预估 预估算法:{(?G)*1024-system}/请求大小 (?G):表示内存大小1024:表示内存容量标准进制system:表示系统和服务占用的额外内存和需要预留的内存请求大小 ...

  2. fluent当中的梯度宏和VOF梯度的获取【转载】

    1 FLUENT变量梯度宏 C_R_G C_P_G C_U_G C_V_G C_W_G C_T_G C_H_G C_YI_G C_R_RG C_P_RG C_U_RG C_V_RG C_W_RG C_ ...

  3. IIS错误代码500.21 ,Nhibernate更新报错,委托的使用。action传参数

    快速阅读 IIS错误代码500.21 ,Nhibernate更新报错,委托的使用.action传参数 IIS错误代码500.21 HTTP 错误 500.21 - Internal Server Er ...

  4. 在mybtis的映射文件中判断集合大小

    <if test="groupIds != null and groupIds.size>0"> and (group_id in<foreach coll ...

  5. H5注意点(1)

    H1标签在企业开发中,每一个页面至多只能有一个H1标签,被H1标签包裹的是整个页面最重要的信息. img标签,格式:<img src=" ">,当中src就是用来告诉i ...

  6. layer.msg如何让按钮的回调执行完毕后弹框不自动关闭

    问题出现:我点击“确定”时会验证“新手机号码”,如果验证不通过则不给该弹框关掉,但是实际操作时,不管验证怎么样,点击“确定”之后该弹框都会关掉. 之前的写法: layer.open({         ...

  7. JVM 初始化阶段的重要意义分析

    1.创建一个Mytest6类和Singleton类 public class MyTest6 { public static void main(String[] args) { Singleton ...

  8. MQTT教學(一):認識MQTT

    http://swf.com.tw/?p=1002 本系列文章旨在補充<超圖解物聯網IoT實作入門>,採用Arduino.ESP8266和Node.js實作MQTT物聯網通訊實驗. MQT ...

  9. Mac OS docker挂载文件夹

    sudo docker run -p 3306:3306 --name mysql -v /var/run/docker.sock:/var/run/docker.sock -v ~/mysql/co ...

  10. mailgun php 邮件发送 实例

    步骤如下: 通过 composer 获取代码库 获取 API Key 以及 domain 编写代码发送邮件 1. 首先通过 composer 获取依赖代码库,参考官网给的命令 https://docu ...