String painter

Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 6934    Accepted Submission(s): 3357

Problem Description
There are two strings A and B with equal length. Both strings are made up of lower case letters. Now you have a powerful string painter. With the help of the painter, you can change a segment of characters of a string to any other character you want. That is, after using the painter, the segment is made up of only one kind of character. Now your task is to change A to B using string painter. What’s the minimum number of operations?
 
Input
Input contains multiple cases. Each case consists of two lines: The first line contains string A. The second line contains string B. The length of both strings will not be greater than 100.
 
Output
A single line contains one integer representing the answer.
 
Sample Input
zzzzzfzzzzz abcdefedcba abababababab cdcdcdcdcdcd
 
Sample Output
6 7
 
Source
 
Recommend
lcy   |   We have carefully selected several similar problems for you:  2480 2481 2478 2482 2475 
 
题意:给你两个相同长度只包含小写字母的字符串 a 和 b,现在你可以进行多次操作,每次操作选择 a 中连续的一段把该段所有位置变为一个相同的字母,现在问你最少要操作多少次可以把字符串 a 变成 b。
思路:简单的区间dp加上普通的dp,因为我们如果直接考虑把 a 串变成 b 串的化不好操作,因为你不知道那些相同字符串要哪些不要。那我我们就直接考虑从空串变到 b 串所需的最小操作次数(区间dp),再考虑 a,b 中相同字母的情况(普通dp)。
设dp[i][j]为空串的区间(i,j)变成 b 串的区间(i,j)需要的最少操作数。对于空串变成 b 串 ,由于我们可以将一段连续的区间变成相同字母,所以对于dp[i][j],我们可以考虑 i 位置是由(i+1,j)中与 i 位置颜色相同的位置连续涂色(假设当前位置为k,我们直接将(i,k)变成相同的字母)得出的。那么dp[i][j] = min ( dp[i][j] , dp[i+1][k-1] + dp[k+1][j]);
因为我们已经将(i,k)变成相同的字母,此时 i ,k位置已经满足条件了,所以我们只要再考虑(i+1,k-1)和(k+1,j)的情况就行了。
我们求出从空串变到 b 串的操作次数了,那我们现在只要考虑字母相同位置的选择就可以了
代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
char a[],b[];
int dp[][];
int ans[];
int main(){
while(scanf("%s%s",a,b)!=EOF){
int len=strlen(a);
int cnt=;
for(int i=;i<len;i++){
dp[i][i]=;
}
for(int i=;i<len;i++){
for(int j=;i+j<len;j++){
dp[j][i+j]=1e9;
for(int k=j;k<=i+j;k++){
if(k!=j&&b[j]==b[k])
dp[j][i+j]=min(dp[j][i+j],dp[j+][k]+dp[k+][i+j]);
else
dp[j][i+j]=min(dp[j+][i+j]+,dp[j][i+j]);
}
//rintf("%d %d %d\n",j,i+j,dp[j][i+j]);
/*afgadfabb
abcacbacc*/
}
}
for(int i=;i<len ;i++){
if(a[i]==b[i]){
if(i==){
ans[i]=;
}
else
ans[i]=ans[i-];
}
else{
ans[i]=dp[][i];//ans[i]表示前i位置考虑相同字母时的取值情况
for(int j=;j<i;j++)
ans[i]=min(ans[i],ans[j]+dp[j+][i]);
}
//printf("%d %d\n",i,ans[i]);
}
printf("%d\n",ans[len-]); }
}

hdu2476(区间dp+dp)的更多相关文章

  1. 区间型DP

    区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...

  2. CF49E Common ancestor(dp+dp+dp)

    纪念卡常把自己卡死的一次自闭模拟赛 QWQ 一开始看这个题,以为是个图论,仔细一想,貌似可以直接dp啊. 首先,因为规则只有从两个变为1个,貌似可以用类似区间\(dp\)的方式来\(check\)一段 ...

  3. 【POJ 2923】Relocation(状压DP+DP)

    题意是给你n个物品,每次两辆车运,容量分别是c1,c2,求最少运送次数.好像不是很好想,我看了网上的题解才做出来.先用状压DP计算i状态下,第一辆可以运送的重量,用该状态的重量总和-第一辆可以运送的, ...

  4. hdu2476 区间dp

    //Accepted 300 KB 31 ms //区间dp 思路完全网上看的 #include <cstdio> #include <cstring> #include &l ...

  5. POJ 1141 Brackets Sequence(区间DP, DP打印路径)

    Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...

  6. ZOJ 3632 Watermelon Full of Water (线段树 区间更新 + dp)

    题目大意: 让每天都能吃到西瓜. 最少须要花多少钱. 思路分析: dp[pos] 就表示  要让 前i天每天都有西瓜吃.最少须要花多少钱. 那么假设你买这个西瓜的话. 那么这个西瓜能吃的持续时间都要更 ...

  7. P1280 尼克的任务[区间覆盖dp]

    题目描述 尼克每天上班之前都连接上英特网,接收他的上司发来的邮件,这些邮件包含了尼克主管的部门当天要完成的全部任务,每个任务由一个开始时刻与一个持续时间构成. 尼克的一个工作日为N分钟,从第一分钟开始 ...

  8. [区间+线性dp]数字游戏

    题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共\(n\)个),你要按顺 ...

  9. BZOJ2298: [HAOI2011]problem a(带权区间覆盖DP)

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1747  Solved: 876[Submit][Status][Discuss] Descripti ...

随机推荐

  1. spring cloud工具的概念

    spring cloud是一个基于spring boot实现的微服务架构开发工具.它为微服务架构中涉及的配置管理.服务治理.断路器.智能路由.微代理.控制总线.全局锁.决策竞选.分布式会话和集群状态管 ...

  2. galera集群

    一.环境准备 1.各主机配置静态域名解析: cat /etc/hosts 127.0.0.1   localhost localhost.localdomain localhost4 localhos ...

  3. 【转载】Sqlserver使用Right函数从最右边向前截取固定长度字符串

    在SQL语句查询过程中,Sqlserver支持使用LEFT().RIGHT().SUBSTRING()等几个函数对字符串进行截取操作,其中Left函数表示从开始字符向后截取多少个字符,Right函数表 ...

  4. node.js 微信开发3-网页授权

    1.配置公众号的自定义菜单,如 { "button":[ { "type":"view", "name":"公 ...

  5. JAVA中使用递归和尾递归实现1000的阶乘的比较

    在JAVA中求阶乘首先遇到的问题就是结果溢出,不管是使用int还是long,double都无法表示1000!这么大的天文数字,这里暂且用BigInteger解决这个问题! 下面是使用递归和尾递归分别计 ...

  6. Oracle加密解密

    Oracle内部有专门的加密包,可以很方便的对内部数据进行加密(encrypt)和解密(decrypt). 介绍加密包之前,先简单说一下Oracle基本数据类型——RAW类型. RAW,用于保存位串的 ...

  7. sql的时间格式

    sql中的时间格式转换主要有:date_format函数,str_to_date函数 1. 首先选择一个数据库 use db_name; 2. 显示当前时区的时间: SELECT NOW(); 3. ...

  8. Shell脚本字符串匹配及日常命令工具 - 用法总结(技巧指南)

    Shell提供了很多字符串和文件处理的命令,如awk.expr.grep.sed等命令,还有文件的排序.合并和分割等一系列的操作命令.下面重点总结下Shell字符串处理.文本处理以及各类命令及函数用法 ...

  9. 数组中的filter,every,some,find,findIndex

    这些都是es5中数组新增的方法,一旦用到还是觉得挺实用的 var arr = [0,12,4,6,8]; var res = arr.filter(function(item,index,Arr){ ...

  10. Codeforces #366 (Div. 2) D. Ant Man (贪心)

    https://blog.csdn.net/liangzhaoyang1/article/details/52215276  原博客 原来好像是个dp题,不过我看了别人的博客使用贪心做的 复杂度(n^ ...