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. Codeforces225E - Unsolvable

    Portal Description 求所有对于方程\[z=\left \lfloor \frac{x}{2} \right \rfloor+y+xy\]不存在正整数解\((x,y)\)的\(z\)中 ...

  2. msp430项目编程000

    msp430中项目---LED数码管显示 1.数码管介绍 2.代码(直接使用引脚驱动) 3.代码(使用译码器驱动) 4.项目总结 msp430项目编程 msp430入门学习

  3. 哀悼改变全站颜色为灰色CSS代码收藏

    <style type="text/css">   *{       filter:progid:DXImageTransform.Microsoft.BasicIma ...

  4. PHP中的魔术方法【转载】

    __construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep, __wakeup, _ ...

  5. DELL IDRAC API接口开发文档翻译及client模块

    今天和DELL官网要了一份关于服务器IDRAC 版本7/8 的API开发文档,花了一天的时间,进行了翻译,不一定全部准确,但对于英语不好的人会有所帮助.也不用重复造轮子了.下载链接: IDRAC AP ...

  6. CodeForces 592A PawnChess

    简单暴力模拟. #include<cstdio> #include<cstring> #include<cmath> #include<algorithm&g ...

  7. codeforces 892E(离散化+可撤销并查集)

    题意 给出一个n个点m条边的无向联通图(n,m<=5e5),有q(q<=5e5)个询问 每个询问询问一个边集{Ei},回答这些边能否在同一个最小生成树中 分析 要知道一个性质,就是权值不同 ...

  8. 转 常见hash算法的原理

    散列表,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法.顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙. 散列表(Hash table,也叫 ...

  9. [wxWidgets]_[0基础]_[不常见但有用的类wxCmdLineParser]

    场景: 1. 有时候须要构造命令行字符串传递給函数调用,比方CreateProcess,假设參数是动态的,那么就得使用类似std::vector<string>加入单个參数,之后拼接为一个 ...

  10. yii2利用自带UploadedFile上传图片

    创建一个 models/UploadForm.php: <?php namespace app\models; use yii\base\Model; use yii\web\UploadedF ...