LA 4394 刷字符串(区间dp)
题意:给定两个长度相等,只有小写字母组成字符串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)相关推荐
- LA 4394 String painter 区间DP -
题目地址:http://vjudge.net/problem/UVALive-4394 很明显的区间DP 区间DP的套路就是 d[i][j]的在区间 (i,j) 刷的次数 转移也一般是 d[i][j] ...
- UVA 11584 Partitioning by Palindromes (字符串区间dp)
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- 刷题周记(八)——#区间DP:多边形、清空字符串 #状态机:股票买卖I~V、大盗阿福
文章目录 --2020年12月13日(周日)------------------ #区间DP 一.多边形 --2020年12月14日(周一)------------------ --2020年12月1 ...
- hdu 4632 子字符串统计的区间dp
题意:查找这样的子回文字符串(未必连续,但是有从左向右的顺序)个数. 简单的区间dp,哎,以为很神奇的东西,其实也是dp,只是参数改为区间,没做过此类型的题,想不到用dp,以后就 知道了,若已经知道[ ...
- [HIHO1323]回文字符串(区间dp)
题目链接:http://hihocoder.com/problemset/problem/1323 思路:区间dp,按照区间长度枚举所有区间和区间的起始位置.这时也可获取到区间的末位,比对这两个字符是 ...
- HDU 2476 String painter (区间DP)
题意:给出两个串a和b,一次只能将一个区间刷一次,问最少几次能让a=b 思路:首先考虑最坏的情况,就是先将一个空白字符串刷成b需要的次数,直接区间DP[i][j]表示i到j的最小次数. 再考虑把a变成 ...
- hdu_2476_String painter(区间DP)
题目链接:hdu_2476_String painter 题意: 有a,b两字符串,现在你有一个刷子,每次可以任选一个区间,使这个区间变成你想要的字符,现在让你将a变成b,问最少刷多少次 题解: 考虑 ...
- 区间DP小结(附经典例题)
写这篇文章的目的主要是想总结下区间DP的经典题目,同时给自己复习巩固这方面知识点. 区间DP 一.定义 区间DP是线性动态规划的扩展,适用场景为每段区间的最优解可以通过更小区间的最优解得到.所以我 ...
- 算法5:线性DP与区间DP
目录 一.算法解释 二.经典例题:数字三角形 三.最长上升子序列 四.最长公共子序列 五 .最短编辑距离 六.编辑距离(和上题十分相似) 七 .区间DP(状态表示是一个区间) 一.算法解释 适用范围: ...
最新文章
- Django源码分析10:makemigrations命令概述
- 【GDOI2016模拟3.16】幂(容斥 + 模型复杂转化)
- Postfix+Amavisd-new+Spamassassin+ClamAV整合安装
- 2021-05-10 矩阵AB和矩阵BA有什么联系?
- cors跨域_跨域,不止CORS
- 前端学习(2850):简单秒杀系统学习之绝对定位
- SAP License:新总帐行项目无法显示
- 喜迎二十大知识竞赛答题小程序源码
- 优雅编程之项目注意这些,你就“正常”了(十七)
- CRMEB商城的新零售模式
- NOIP2011(提高组)DAY2---观光公交(vijosP1741)
- 关于半岛体试验的一些知识汇总
- ubuntu安装最新的chrome浏览器
- 微信小程序父子组件方法调用方法汇总
- 【JAVA面试题】java面试题100道详解
- 微信小程序输入框输入换行
- 一个新技术与传统产业开始越来越深入融合的发展新趋势
- 并发与多线程相关知识点梳理
- Topical PageRank(TPR)论文解读
- Excel函数之— SUMPRODUCT用法(一),太强大了