String painter

来源:互联网 发布:守望先锋英雄数据库 编辑:程序博客网 时间:2024/05/18 02:23

String painter

Time Limit : 5000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)

Total Submission(s) : 22 Accepted Submission(s) : 14

Font: Times New Roman | Verdana | Georgia

Font Size: ← →

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

Statistic | Submit | Back

比较复杂的区间DP

#include<iostream>#include<string>#include<cstring>#include<cstdio>#include<algorithm>using namespace std;#define maxsize 105char s1[maxsize];char s2[maxsize];int dp[maxsize][maxsize];int ans[maxsize];int main(){    while (scanf("%s%s", s1, s2) != EOF)    {        int len = strlen(s1);        memset(dp, 0, sizeof(dp));        for (int j = 0; j < len; j++)        {            for (int i = j; i >= 0; 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 = 0; i < len; i++)        {            ans[i] = dp[0][i];        }        for (int i = 0; i < len; i++)        {            if (s1[i] == s2[i])            {                ans[i] = ans[i - 1];            }            else            {                for (int j = 0; j < i; j++)                {                    ans[i] = min(ans[i], ans[j] + dp[j + 1][i]);                }            }        }        printf("%d\n", ans[len - 1]);    }    system("pause");    return 0;}