首页 > 代码库 > LA 4394

LA 4394

Description

Download as PDF
 

 


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

令dp[l][r] 为l到r区间从空串刷成b串所需的最少次数
则dp[l][r] = min(dp[l][k] + dp[k + 1][r])
如果 b[l] == b[r] dp[l][r] = min(dp[l][r], dp[l][r - 1])

最后设f[i]为1 到 i从a串刷到b串的最少次数(下标从1开始)
则 f[i] = min(f[j] + dp[j][i - 1])
如果a[i] == b[i]则 f[i] = min(f[i], f[i - 1])

 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 #include <vector> 6 #include <queue> 7  8 using namespace std; 9 10 #define read() freopen("sw.in", "r", stdin)11 12 const int MAX = 105;13 char a[MAX], b[MAX];14 int dp[MAX][MAX];15 int f[MAX];16 17 void solve() {18         int n = strlen(a);19         for (int len = 1; len <= n; ++len) {20                 for (int l = 0; l + len - 1 < n; ++l) {21                         int r = l + len - 1;22                         dp[l][r] = len;23                         if (l == r) {24                                 dp[l][r] = 1;25                                 continue;26                         }27                         for (int k = l; k <= r; ++k) {28                                 if (k + 1 > r) continue;29                                 dp[l][r] = min(dp[l][r], dp[l][k] + dp[k + 1][r]);30                         }31                         if (b[l] == b[r]) dp[l][r] = min(dp[l][r - 1], dp[l][r]);32                         //printf("l = %d r = %d %d\n", l, r, dp[l][r]);33                 }34         }35 36         for (int i = 0; i < n; ++i) {37                 f[i + 1] = dp[0][i];38                 if (a[i] == b[i]) f[i + 1] = min(f[i + 1], f[i]);39                 for (int j = 0; j < i; ++j) {40                         if (j + 1 > i) continue;41                         f[i + 1] = min(f[i + 1], f[j + 1] + dp[j + 1][i]);42                 }43         }44 45         //for (int i = 0; i < n; ++i) printf("%d ", f[i]);46         printf("%d\n", f[n]);47 48 49 }50 51 int main()52 {53 54     int t;55     //read();56     while (scanf("%s%s", a, b) != EOF) {57            solve();58     }59     //cout << "Hello world!" << endl;60     return 0;61 }
View Code