题意:给定两个长度相等,只有小写字母组成字符串A和B,每步可以把A的一个连续子串刷成同一个字母,问至少需要多少步才能把A变成B。

分析:区间DP,区间DP的套路就是 d[i][j]的在区间 (i,j) 刷的次数。二维无法转移,所以需要增加维度。关键是贪心出一个性质,每次刷一个串,都可以从头开始刷起,如果第一个字符相同,则从第二个开始刷,而每次刷要么只刷一个字符,要么刷到另一个与目标串首字符相同的字符为止。dp[L][R][C]表示将该串刷成目标串所需要的最小步数(L、R表示待刷的字符串的区间,C表示该字符串的状态,如果C为26则表示该串未被刷,而当0<=C<=25时,则表示该串被刷成了’a’+C-1的字符序列)。状态转移方程为dp[L][R][C]=min{1+dp[L+1][k-1][s2[L]-‘a’+1]+dp[k+1][R][C]  | s2[L]==s2[k]},边界条件为当L>R时,dp值为0。参考http://www.bubuko.com/infodetail-2777944.html。

代码:

#include<bits/stdc++.h>
using namespace std;
char str1[1000],str2[1000];
int dp[160][160][36];
///记忆化搜索
int dfs(int l,int r,int c){if(l>r)///边界return 0;if(dp[l][r][c]!=-1)return dp[l][r][c];if((c==26&&str1[l]==str2[l])||str2[l]==c+'a')return dp[l][r][c]=dfs(l+1,r,c);dp[l][r][c]=1+dfs(l+1,r,c);for(int i=l+1; i<=r; i++)if(str2[l]==str2[i])dp[l][r][c]=min(dp[l][r][c],1+dfs(l+1,i-1,str2[l]-'a')+dfs(i+1,r,c));return dp[l][r][c];
}
int main(){while(~scanf("%s%s",str1,str2)){int len=strlen(str1);memset(dp,-1,sizeof(dp));printf("%d\n",dfs(0,len-1,26));}return 0;
}

LA 4394 刷字符串(区间dp)相关推荐

  1. LA 4394 String painter 区间DP -

    题目地址:http://vjudge.net/problem/UVALive-4394 很明显的区间DP 区间DP的套路就是 d[i][j]的在区间 (i,j) 刷的次数 转移也一般是 d[i][j] ...

  2. UVA 11584 Partitioning by Palindromes (字符串区间dp)

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  3. 刷题周记(八)——#区间DP:多边形、清空字符串 #状态机:股票买卖I~V、大盗阿福

    文章目录 --2020年12月13日(周日)------------------ #区间DP 一.多边形 --2020年12月14日(周一)------------------ --2020年12月1 ...

  4. hdu 4632 子字符串统计的区间dp

    题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[ ...

  5. [HIHO1323]回文字符串(区间dp)

    题目链接:http://hihocoder.com/problemset/problem/1323 思路:区间dp,按照区间长度枚举所有区间和区间的起始位置.这时也可获取到区间的末位,比对这两个字符是 ...

  6. HDU 2476 String painter (区间DP)

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

  7. hdu_2476_String painter(区间DP)

    题目链接:hdu_2476_String painter 题意: 有a,b两字符串,现在你有一个刷子,每次可以任选一个区间,使这个区间变成你想要的字符,现在让你将a变成b,问最少刷多少次 题解: 考虑 ...

  8. 区间DP小结(附经典例题)

    写这篇文章的目的主要是想总结下区间DP的经典题目,同时给自己复习巩固这方面知识点. 区间DP 一.定义 ​ 区间DP是线性动态规划的扩展,适用场景为每段区间的最优解可以通过更小区间的最优解得到.所以我 ...

  9. 算法5:线性DP与区间DP

    目录 一.算法解释 二.经典例题:数字三角形 三.最长上升子序列 四.最长公共子序列 五 .最短编辑距离 六.编辑距离(和上题十分相似) 七 .区间DP(状态表示是一个区间) 一.算法解释 适用范围: ...

最新文章

  1. Django源码分析10:makemigrations命令概述
  2. 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)
  3. Postfix+Amavisd-new+Spamassassin+ClamAV整合安装
  4. 2021-05-10 矩阵AB和矩阵BA有什么联系?
  5. cors跨域_跨域,不止CORS
  6. 前端学习(2850):简单秒杀系统学习之绝对定位
  7. SAP License:新总帐行项目无法显示
  8. 喜迎二十大知识竞赛答题小程序源码
  9. 优雅编程之项目注意这些,你就“正常”了(十七)
  10. CRMEB商城的新零售模式
  11. NOIP2011(提高组)DAY2---观光公交(vijosP1741)
  12. 关于半岛体试验的一些知识汇总
  13. ubuntu安装最新的chrome浏览器
  14. 微信小程序父子组件方法调用方法汇总
  15. 【JAVA面试题】java面试题100道详解
  16. 微信小程序输入框输入换行
  17. 一个新技术与传统产业开始越来越深入融合的发展新趋势
  18. 并发与多线程相关知识点梳理
  19. Topical PageRank(TPR)论文解读
  20. Excel函数之— SUMPRODUCT用法(一),太强大了

热门文章

  1. Bootstrap 教程入门
  2. 无人驾驶模型预测控制(五)-基于动力学模型的无人驾驶车辆主动转向控制
  3. 2022年蓝桥杯:第十三届蓝桥杯大赛软件赛省赛C/C++大学B组真题(考后回顾,文末附真题链接)
  4. 第十二届蓝桥杯 Java 省赛 B 组部分真题解析
  5. git 删除本地未提交的内容
  6. 【软件工程】软件工程知识点提纲8
  7. 清空MySQL单库下所有表数据 || 删除MySQL单库下所有表
  8. 数据结构与算法-栈与队列
  9. jQuery属性操作以及一些实用方法
  10. android ellipsize的使用