HDU2476——String painter(区间dp)

来源:互联网 发布:手机淘宝怎么改用户名 编辑:程序博客网 时间:2024/06/06 02:34

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

zzzzzfzzzzzabcdefedcbaababababababcdcdcdcdcdcd

Sample Output

67

这道有点难想啊

得分成两个部分解决这个问题

dp[i][j]表示把一个空串(或者与目标串完全不同的串)刷成目标串所需要的步数。

我们去寻找目标串中间的字符,如果和这段头相同,就相当于在刷它的时候顺便刷了字符串头。

然后在根据第一步结果求res。



#include <cstdio>#include <cstring>#include <string>#include <algorithm>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <cmath>#include <cstdlib>#include <iostream>using namespace std;const int MAXN =310;const int INF =1000000007 ;const int MOD =1000000007;const double EPS=1e-8;const double pi = acos(-1);int dp[MAXN][MAXN];int ans[MAXN];string a,b;int main(){    while(cin>>a>>b){        int n=a.length();        memset(dp,0,sizeof(dp));        memset(ans,0,sizeof(ans));        for(int k=0;k<n;k++){            for(int i=0;i+k<n;i++){                int j=i+k;                dp[i][j]=min(dp[i+1][j]+1,dp[i][j-1]+1);                for(int m=i+1;m<=j;m++){                    if(b[m]==b[i]){                        dp[i][j]=min(dp[i][j],dp[i+1][m]+dp[m+1][j]);                    }                }            }        }        for(int i=0;i<n;i++)            ans[i]=dp[0][i];        for(int i=0;i<n;i++){            if(a[i]==b[i])                ans[i]=ans[i-1];            else{                for(int j=0;j<i;j++){                    ans[i]=min(ans[j]+dp[j+1][i],ans[i]);                }            }        }        printf("%d\n",ans[n-1]);    }}








0 0
原创粉丝点击