String painter
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3694 Accepted Submission(s): 1719
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.
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
题意:给你两个字符串,要求从第一个字符串变到第二个字符串最少需要几步,每步可以把任意区间的字符串变成同一个任意字母的字符串。
思路:比较难的区间dp,首先区间dp算出从无变到目标字符串任意区间的最少步数,然后第二步再从头dp到尾,挺难解释的,看代码吧:
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<bitset>
#include <utility>
using namespace std;
#define maxn 105
#define inf 0x3f3f3f3f
typedef long long LL;
const int mod = 1e8;
char s1[maxn], s2[maxn];
int dp[maxn][maxn], ans[maxn];
int main(){
while (~scanf("%s%s",s1,s2)){
int len = strlen(s1);
memset(dp, 0, sizeof(dp));
for (int i = 0; i < len; i++)
dp[i][i] = 1;
for (int i = 0; i < len; i++){
for (int j = 0; j + i < len; j++){
dp[j][j + i] = dp[j + 1][j + i] + 1;
for (int k = j + 1; k <= j + i; k++){
if (s2[j] == s2[k])
dp[j][j + i] = min(dp[j][j + i], dp[j + 1][k] + dp[k + 1][j + i]);
}
}
}
ans[0] = 0;
for (int i = 0; i < len; i++){
ans[i + 1] = dp[0][i];
if (s1[i] == s2[i])
ans[i + 1] = ans[i];
else
for (int j = 1; j <= i; j++)
ans[i + 1] = min(ans[i + 1], ans[j] + dp[j][i]);
}
printf("%d\n", ans[len]);
}
}