HDU2476

String painter

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


 

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

不会。。不知道在敲什么。。 AC了。。

#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 105;
char s1[N],s2[N];
int dp[N][N];
int ans[N];
int main()
{
	while(~scanf("%s%s",s1+1,s2+1))
	{
		int n = strlen(s1+1);
		memset(dp,0,sizeof(dp));
		for(int i = 1;i <= n;i ++)
		{
			for(int j = 1;j <= n;j ++)
			{
				dp[i][j] = j - i + 1;
				
			}
		}
		
		for(int j = 1;j <= n;j ++)
		{
			for(int i = j;i >= 1;i --)
			{
				dp[i][j] = dp[i+1][j] + 1;
				for(int k = i + 1;k <= j;k ++)
				{
					if(s2[i] == s2[k])
					dp[i][j] = min(dp[i][j],dp[i+1][k]+dp[k+1][j]);
				}
			}
		}
		for(int i = 1;i <= n;i ++)
		{
			ans[i] = dp[1][i];
			if(s1[i] == s2[i])
			ans[i] = min(ans[i],ans[i-1]);
			else
			for(int j = 1;j < i;j ++)
			{
				ans[i] = min(ans[i],ans[j] + dp[j+1][i]);
			}
		}
		cout << ans[n] << endl;
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/soul_97/article/details/81133556