String painter

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

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
题目描述 : 给定一个初始串,目标串,每步可以通过改变一个连续的子串使其变为同一个字母,至少需要多少步?
我们发现一段序列,每一步的选择是可以改变任意长度的连续子串,
那么通过枚举改变哪些连续子串,可以包含所有的情况。
d[i]表示以i结尾的序列变成目标串需要的最少步骤。d[i]=min(d[i],d[k]+dp[k+1][i]),因为是[k+1,i]区间是连续改变的,
那么我们可以将dp[k+1][i]看成是表示[k+1,i]区间内一个相同串到目标串的最少步骤(刷[k+1,i]区间内的字符串,使这段连续的子串变为同一个字母).
初始化dp[i][i]=1;
dp[i][j]=dp[i][j-1]+1;
if(a[i]==a[k])   //有相同的连续改变才会有作用,不同,无论通过何种方式.每一个都需要改变,改变次数都一样
//相同的话,通过连续改变,可以减少改变次数,
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j-1]);
初始化d数组为0,d[i]=dp[0][1];
d[i]=min(d[i],d[k]+dp[k+1][i-1]);
通过枚举改变的连续子串的长度
动态规划: 定义状态,每一步的选择,包含了所有的可能性
最优子结构无后效性,如果状态设计不合理,会导致有后效性。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char a[],b[];
int dp[][],d[];
int Length;
void init()
{
memset(dp,,sizeof(dp));
memset(d,,sizeof(d));
for(int i=;i<Length;i++)
dp[i][i]=; }
void solve()
{
/* for(int i=0;i<Length;i++)
for(int j=0;j<Length;j++)
for(int k=i;k<=j;k++)
{
dp[i][j]=min(DP(dp[i][k]+dp[k+1][j]),dp[i][j]);
}
for(int s=0;s<Length;s++)
{
for(int j=0;j<Length;j++)
printf("%d ",dp[s][j]);
printf("\n");
}
printf("2\n");
printf("%d\n",dp[0][Length-1]);
*/
for(int t=;t<Length;t++)
for(int i=;i<Length;i++)
{
int j=i+t;
if(j>=Length)
break;
dp[i][j]=dp[i][j-]+;
for(int k=i;k<j;k++)
{
if(b[k]==b[j]) //如果目标串有相同的,就可以一同处理
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+][j-]);
}
} for(int i=;i<Length;i++)
d[i]=dp[][i];
for(int i=;i<Length;i++)
{
if(a[i]==b[i])
d[i]=d[i-];
else
{
for(int k=;k<i;k++)
d[i]=min(d[i],d[k]+dp[k+][i]);
} }
}
int main()
{
//freopen("test.txt","r",stdin);
while(~scanf("%s%s",a,b))
{
Length=strlen(a);
init();
solve();
printf("%d\n",d[Length-]);
}
return ;
}
 

hdu 2476 (string painter) ( 字符串刷子 区间DP)的更多相关文章

  1. HDU 2476 String painter (区间DP)

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

  2. HDU 2476 String painter(区间DP)

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

  3. HDU 2476 String painter(区间dp)

    题意: 给定两个字符串,让求最少的变化次数从第一个串变到第二个串 思路: 区间dp, 直接考虑两个串的话太困难,就只考虑第二个串,求从空白串变到第二个串的最小次数,dp[i][j] 表示i->j ...

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

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

  5. hdu 2476 String Painter

    第一道区间dp题,感觉题意不是很好理解 题意:一次可以转换某一个位置的字符,或是一串连续的字符,举第一个例子zzzzzfzzzzz 1:aaaaaaaaaaa 2: abbbbbbbbba 3: ab ...

  6. HDU 2476 String painter 刷字符串(区间DP)

    题意: 给出两个串s1和s2,每次可以将s1中的一个整个区间刷成同个字母,问最少刷几次才能让s1变成s2? 思路: 假设最坏情况,两串没任何一个位置是相同的,那么全都得刷,相当于将一个空白串刷成s2. ...

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

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

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

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

  9. 【HIHOCODER 1320】压缩字符串(区间DP)

    描述 小Hi希望压缩一个只包含大写字母'A'-'Z'的字符串.他使用的方法是:如果某个子串 S 连续出现了 X 次,就用'X(S)'来表示.例如AAAAAAAAAABABABCCD可以用10(A)2( ...

随机推荐

  1. POJ 1236 学校网络间的强连通

    题目大意: N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输.问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件.问题2:至少需要添加几条 ...

  2. 约分差束 例题 ZOJ 2770 火烧连营

    题目来源:ZOJ Monthly, October 2006, ZOJ2770题目描述:大家都知道,三国时期,蜀国刘备被吴国大都督陆逊打败了.刘备失败的原因是刘备的错误决策.他把军队分成几十个大营,每 ...

  3. 深入理解计算机操作系统——第11章:CS模型,网络

    网络编程: 11.1 客户端-服务器编程模型 (1)一个应用是由一个服务器进程和一个或多个客户端进程组成. (2)服务器管理某种资源,并且操纵这种资源来为客户端服务. CS模型: CS的基本操作是事务 ...

  4. XCode warning:“View Controller” is unreachable because it has no entry points

    Unsupported Configuration: “View Controller” is unreachable because it has no entry points, and no i ...

  5. ubuntu 14.04 安装docker,docker-compose

    通过阿里的镜像安装 curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | s ...

  6. 通过XMLHttpRequest,ActiveXObject实现ajax请求

    今天学习了原生的ajax请求.我将涉及到的ajax请求方法封装成了一个对象: var xhr={     getXHR:function(){         var XHR = null;      ...

  7. [Bzoj1051][HAOI2006]受欢迎的牛(缩环)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6676  Solved: 3502[Submit][Sta ...

  8. 使用uncss去除无用的CSS

    1.安装nodejs,gulp,gulp_uncss 1.1.说明:gulp-uncss 是gulp的一个插件.gulp是基于nodejs,理所当然需要安装nodejs: 1.2.安装:打开nodej ...

  9. [转] SQL SERVER 2008 R2 安装中的账户设置问题

    故纸堆 原文:SQL SERVER 2008安装中设置账户的问题,2013-7 在安装SQL Server 2008数据库服务器的时候,服务器有可能处于以下几种环境中: ①工作组环境下的服务器 (Wo ...

  10. oracle rac 安装错误整理。

    今天是2014.05.26,离别N久的博客今天继续使用. 近期一直忙着离职.入职另外加上家的网一直没有交费,弄的自己開始不那么安稳.学习就是须要一种心情平静.内心稳妥的去进行. 因换笔记本,特须要又一 ...