String painter
Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2368 Accepted Submission(s): 1038
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
lcy
对于dp[i][j] 来说最差的就是1+dp[i+1][j]咯,那怎么减少呢。。。 如果(i,j]里面也有个k使得b[i] == b[k]那么得话, 可以刷[i,k]这么长的一段,那么就有可能减少1. 但是存在问题,如果有一段跨越了k怎么办。。。 嗯,这个问题是不会出现的, 因为在[i,k]刷了b[i].如果跨越了k那么之前在b[k]刷的颜色就没了,所以是不允许有跨段的, 所以要写成&&想写成 dp[i][j] = dp[i+1][k] + dp[k+1][j]。 为什么不可以跨段 可以思考 BRBR 。 然后后来的那个 一段 要么是可以分段刷的,要么是不可以分段刷的。-
#include <iostream>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <algorithm>
using namespace std;
char a[110];
char b[110];
int dp[110][110];
int ans[110];
int len;
int main()
{
while(gets(a))
{
gets(b);
memset(dp,0,sizeof(dp));
len = strlen(b);
for(int j=0;j<len;j++)
{
for(int i=j;i>=0;i--)
{
dp[i][j] = 1 + dp[i+1][j];
for(int k=i+1;k<=j;k++)
{
if(b[i] == b[k])
dp[i][j] = min(dp[i+1][k]+dp[k+1][j],dp[i][j]);
}
}
}
memset(ans,0,sizeof(ans));
for(int i=0;i<len;i++) ans[i] = dp[0][i];
for(int i=0;i<len;i++)
{
if(a[i] == b[i])
{
ans[i] = ans[i-1];
}
else
{
for(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;
}