zoukankan      html  css  js  c++  java
  • HDU 2476 String painter (区间DP)

    String painter

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


    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
     
     
     
     
    一开始两个字符串很难搞。
    其实可以先算由空白串直接变成str2.
    用区间DP,可以求出dp[i][j].
    然后再计算从str1变成str2.
    //============================================================================
    // Name        : HDU.cpp
    // Author      : 
    // Version     :
    // Copyright   : Your copyright notice
    // Description : Hello World in C++, Ansi-style
    //============================================================================
    
    #include <iostream>
    #include <string.h>
    #include <algorithm>
    #include <stdio.h>
    using namespace std;
    const int MAXN=110;
    int dp[MAXN][MAXN];
    char str1[MAXN],str2[MAXN];
    int ans[MAXN];
    int main()
    {
        //freopen("in.txt","r",stdin);
        //freopen("out.txt","w",stdout);
        while(scanf("%s%s",str1,str2)==2)
        {
            int n=strlen(str1);
            memset(dp,0,sizeof(dp));
            for(int i=0;i<n;i++)
                for(int j=i;j<n;j++)
                    dp[i][j]=j-i+1;
            //先直接DP求出从空白串变成str2
            for(int i=n-2;i>=0;i--)
                for(int j=i+1;j<n;j++)
                {
                    dp[i][j]=dp[i+1][j]+1;
                    for(int k=i+1;k<=j;k++)
                        if(str2[i]==str2[k])
                            dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]);
                }
            for(int i=0;i<n;i++)
            {
                ans[i]=dp[0][i];
                if(str1[i]==str2[i])
                {
                    if(i==0)ans[i]=0;
                    else ans[i]=ans[i-1];
                }
                for(int j=0;j<i;j++)
                    ans[i]=min(ans[i],ans[j]+dp[j+1][i]);
            }
            printf("%d\n",ans[n-1]);
        }
        return 0;
    }
    人一我百!人十我万!永不放弃~~~怀着自信的心,去追逐梦想
  • 相关阅读:
    js递归函数和call()
    前端常用
    整理项目中用到的angularjs及其他js代码
    体验设计真的是让一切简单到极致吗?
    iview table中利用render动态循环输出
    Vue+iview在render函数中添加Poptip提示操作
    jQuery
    外部js调用vue实例方法
    es6 filter() 数组过滤方法总结
    vue通信、传值的多种方式
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3052043.html
Copyright © 2011-2022 走看看