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]时,直接等于前一步。
不等的时候,如代码所示。
神奇,神奇,神奇.......


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

相关文章推荐

HDU2476——String painter(区间dp)

Description There are two strings A and B with equal length. Both strings are made up of lower ca...

HDU2476 - String painter - 区间dp+字符串处理

1.题目描述 There are two strings A and B with equal length. Both strings are made up of lower case ...

【HDU 2476】String Painter(区间DP)

题目大意: 有两个长度不超过100的字符串,A,B,要把A变成B,现在可以连续将N个变成相同的字母,问你至少要变多少次。(N为无限) 题目思路:只要该位置不与B的该位置相同,那么就等同于空白,假如...

HDU 2476 - String painter(区间DP)

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2476 题意: 给出相同长度的a,b两端字符串,每次可以将a串中的任意连续区间修改成相同的任意字...

hdu 2476 String painter 区间dp

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

Hdu 2476 String painter(区间dp)

题目链接 String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/...

String painter hdu2476(区间dp)

点击打开链接 String painter Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (J...

hdu2476String painter【区间dp】递推+递归的记忆化搜索

开始刷dp,图论的算法周末或者上课再学~这个题AC率那么高居然不会做==,太弱了 说题意:刷一下这个线段变成都是一个字母,再刷一下可以覆盖原来的,问最少刷几下由A串变成B串。开始就想到括号匹配了,但...

hdu 2476 String painter 区间dp

hdu 2476 String painter 区间dp

HDU - 2476String painter(区间DP)

String painterTime Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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