hdu2476 String painter(区间dp)

来源:互联网 发布:autodesk主要软件 编辑:程序博客网 时间:2024/05/16 10:49

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
zzzzzfzzzzzabcdefedcbaababababababcdcdcdcdcdcd
 

Sample Output
67


参考: http://blog.csdn.net/libin56842/article/details/9708807



#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<stack>#include<vector>#include<set>#include<map>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MID(x,y) ((x+y)>>1)#define eps 1e-8typedef __int64 ll;using namespace std;#define N 105int dp[N][N],ans[N];char a[N],b[N];int main(){   int i,j;   while(~scanf("%s",a))   {     scanf("%s",b);     int len=strlen(b);          memset(dp,0,sizeof(dp));     for(i=0;i<len;i++)dp[i][i]=1;  for(i=len-1;i>=0;i--)    for(j=i+1;j<len;j++){dp[i][j]=dp[i+1][j]+1;for(int k=i+1;k<=j;k++)if(b[i]==b[k])  dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k+1][j]);}  for(i=0;i<len;i++)  {    ans[i]=dp[0][i];    if(a[i]==b[i])  {   if(i==0)ans[i]=0; elseans[i]=ans[i-1];  }  elsefor(int k=0;k<i;k++)   ans[i]=min(ans[i],ans[k]+dp[k+1][i]);  }  printf("%d\n",ans[len-1]);   }   return 0;}



1 0
原创粉丝点击