hdu 2476 String painter(区间qp)

原创 2016年08月28日 21:34:30

String painter

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



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
2008 Asia Regional Chengdu


题意:给你两个字符串,求出第一串改成第二串的最小步数,修改的方式是你可以选择任意区间,将其中所有字母修改成同一个字母。

思路:
       毫无疑问是区间dp,但是怎么写出表达式是一个很严肃的问题o( ̄▽ ̄)do( ̄▽ ̄)do( ̄▽ ̄)d
     
      由空串修改成第二串这个区间dp还是很好写的,个人觉得下面的那个转化才是神奇。
      空串转化第二串,度娘给我的那个确实不错,但是我估计比较笨,想不到那种转化。 
    当然学习一下还是非常有必要的,说不定什么时候用上了呢。。
    
for(j = 0; j<len; j++)  
        {  
            for(i = j; i>=0; i--)//j为尾,i为头  
            {  
                dp[i][j] = dp[i+1][j]+1;//先每个单独刷  
                for(k = i+1; k<=j; k++)//i到j中间所有的刷法  
                {  
                    if(s2[i]==s2[k])  
                        dp[i][j] = min(dp[i][j],(dp[i+1][k]+dp[k+1][j]));//i与k相同,寻找i刷到k的最优方案  
                }  
            }  
        }  

这里,当i和k位置字符相同时,有dp[i+1][k]+dp[k+1][j] 取最小,这就是精髓所在了。
看清楚,这里是dp[i+1][k],和dp[i][k]有区别,就这一个区别,顿时不一样了,因为相等,所以i可以和k同刷,即dp[i][k]==dp[i+1][k];

这个dp就很清晰很明了了。

我没想到,所以,自己写了一个搓逼代码,那可真是挫orz
 for(int len=2;len<=n;len++)
        {
            for(int l=0;l+len-1<n;l++)
            {
                int r=l+len-1;
                if(s[l]==s[l+1])
                    dp[l][r]=dp[l+1][r];
                else if(s[r]==s[r-1])
                    dp[l][r]=dp[l][r-1];
                else if(s[l]==s[r])
                {
                    dp[l][r]=dp[l+1][r-1]+1;
                    for(int k=1;k<r;k++)
                    if(s[l]==s[k])
                       dp[l][r]=min(dp[l][r],dp[l][k]+dp[k][r]-1);
                }
                for(int k=l;k<r;k++)
                {
                    dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]);
                }
            }
        }

这就是中规中矩的区间dp,毫无创意的搓逼代码。。。对比一下,多余内容好多,就不解释了,只是想证明一下自己的搓逼本质,吐血ing.

最重要的还是下面的由空串如何替换成第一串
代码:
      for(int i=0;i<n;i++)
         res[i]=dp[0][i];

       for(int i=0;i<n;i++)
       {
           if(s[i]==s1[i])
           {
               if(i==0)
                   res[i]=0;
               else
                   res[i]=res[i-1];
           }
           else
           {
               for(int j=0;j<i;j++)
                   res[i]=min(res[i],res[j]+dp[j+1][i]);
           }
       }


这也是一个牛逼的dp呀。
显而易见的这里只计算从[0,i]的转化。
ans[i]代表的是[0,i]的最小转化步数。
当是s1[i]==s2[i]时,直接等于前一步。
不等的时候,如代码所示。
神奇,神奇,神奇.......


 
版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 2476 String painter 动态规划

题意:给定两个字符串a和b,求最少需要对a进行多少次操作,才能将a变成b。每次操作时将a中任意一段变成任意一个字母所组成的段。 题解:动态规划题。dp[i][j]表示a中i到j段变成b需要的最少次数。...
  • a601025382s
  • a601025382s
  • 2013年10月07日 13:10
  • 3049

hdu 2476 String painter dp

题意:给定两个等长字符串
  • a601025382s
  • a601025382s
  • 2014年07月13日 11:36
  • 499

HDU2476:String painter(区间DP)

Problem Description There are two strings A and B with equal length. Both strings are made up of low...
  • libin56842
  • libin56842
  • 2013年08月02日 00:36
  • 5263

【HDU2476】【String painter】

String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • u013200703
  • u013200703
  • 2015年08月05日 00:07
  • 512

hdu 2476 String painter

String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • overload1997
  • overload1997
  • 2016年10月16日 19:49
  • 200

HDU - 2476 String painter

题意:给定两个长度相等,只有小写字母组成的字符串s和t,每步可以把s的一个连续的子串“刷”成同一个字母,问至少需要多少步才能把s变成t 思路:首先预处理,假设s串与t串没有相同的字母,那么用...
  • u011345136
  • u011345136
  • 2013年12月21日 18:22
  • 1135

hdu 2476 String painter

String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...
  • u010228612
  • u010228612
  • 2014年07月04日 22:08
  • 791

HDU 2476 String painter

#include #include #include using namespace std; #define maxn 110 int dp[maxn][maxn]; int g[maxn]...
  • u011277193
  • u011277193
  • 2014年06月04日 21:15
  • 381

String painter HDU - 2476 区间dp+思维

题意:给定a,b两个字符串,让你求将a刷成b所要的最少的次数,刷的时候只能刷连续的一个区间。 思路:先计算出由空串刷成b串的最少次数,因为有相同字符的存在,所以才能尽可能地少刷,设d[i][j]为区...
  • zmh69695328
  • zmh69695328
  • 2017年08月12日 21:56
  • 83

(HDU - 2476)String painter

(HDU - 2476)String painter There are two strings A and B with equal length. Both strings are made up...
  • wozaipermanent
  • wozaipermanent
  • 2017年08月23日 15:31
  • 101
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hdu 2476 String painter(区间qp)
举报原因:
原因补充:

(最多只允许输入30个字)