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. Sublim text 3 同步 eclipse 快捷键

    首选项>按键绑定>用户 配置内容(注意为JSON格式!) [ { "keys": ["shift+enter"], "command&qu ...

  2. java使用AES-256-ECB(PKCS7Padding)解密——微信支付退款通知接口指定解密方式

    1.场景 在做微信支付退款通知接口时,微信对通知的内容做了加密,并且指定用 AES256 解密,官方指定的解密方式如下: 2.导包 <!-- https://mvnrepository.com/ ...

  3. Ubuntu 与 Debian 的关系

    Debian 于 1993年8月16日 由一名美国普渡大学学生 Ian Murdock 首次发表. Debian 是由 GPL 和其他自由软件许可协议授权的自由软件组成的操作系统, 由 Debian ...

  4. 第六篇:Python函数进阶篇

    在了解完了 Python函数基础篇之后,本篇的存在其实是为了整合知识,由于该篇的知识是否杂乱,故大家可以通过点开点连接直接进入其详细介绍,该篇主要大致的介绍一下几个知识点:  一.Python的迭代器 ...

  5. (转)Java锁性能提高有哪些机制?

    转自:https://forum.idevfun.io/t/topic/235/2 Java 中,Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的.但是监视器锁本质又 ...

  6. Mongodb创建用户Error: couldn’t add user: Use of SCRAM-SHA-256 requires undigested passwords

    解决方案:修改mechanisms加密方式为SCRAM-SHA-1 db.createUser({ user: "admin", pwd: "xxx", rol ...

  7. linux网络编程之system v共享内存

    接着上次的共享内存继续学习,这次主要是学习system v共享内存的使用,下面继续: 跟消息队列一样,共享内存也是有自己的数据结构的,system v共享内存也是随内核持续的,也就是说当最后一个访问内 ...

  8. PL/SQL 子查询

    一.概述 在一个SQL语句中嵌套另一个SQL语句成为子查询.包括单行子查询,多行子查询,多列子查询. 注意,当在DDL语句中引用子查询时,可以带有Order By子句:但是当在where子句.Set子 ...

  9. redis中对list类型某个元素的查找和删除

    我们的信息都是放到redis的缓存中,结构为list,如果知道特定的值的话,通过LREM  key  count  value这样就可以.对于redis的list结构,获取某个位置的值通过 LINDE ...

  10. Codeforces Round #336 (Div. 2) D. Zuma(区间DP)

    题目链接:https://codeforces.com/contest/608/problem/D 题意:给出n个宝石的颜色ci,现在有一个操作,就是子串的颜色是回文串的区间可以通过一次操作消去,问最 ...