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]);
}
}
本文探讨了一道复杂的区间动态规划问题——如何将一个字符串通过最少步骤转换为另一个字符串,每步操作可以将任意区间的字符变为同一字符。文章提供了一个高效的算法解决方案,并附带详细代码实现。
642

被折叠的 条评论
为什么被折叠?



