2015 HUAS Summer Trainning #5 C

Description

Let x and y be two strings over some finite alphabet A. We would like to transform x into y allowing only operations given below:

 

  • Deletion: a letter in x is missing in y at a corresponding position.
  • Insertion: a letter in y is missing in x at a corresponding position.
  • Change: letters at corresponding positions are distinct

 

Certainly, we would like to minimize the number of all possible operations.

Illustration

 

A G T A A G T * A G G C  | | |       |   |   | |
 A G T * C * T G A C G C

 

Deletion: * in the bottom line  Insertion: * in the top line  Change: when the letters at the top and bottom are distinct

This tells us that to transform x = AGTCTGACGC into y = AGTAAGTAGGC we would be required to perform 5 operations (2 changes, 2 deletions and 1 insertion). If we want to minimize the number operations, we should do it like

 

A  G  T  A  A  G  T  A  G  G  C  |  |  |        |     |     |  |
 A  G  T  C  T  G  *  A  C  G  C

 

and 4 moves would be required (3 changes and 1 deletion).

In this problem we would always consider strings x and y to be fixed, such that the number of letters in x is m and the number of letters in y is n where n ≥m.

Assign 1 as the cost of an operation performed. Otherwise, assign 0 if there is no operation performed.

Write a program that would minimize the number of possible operations to transform any string x into a string y.

Input

The input consists of the strings x and y prefixed by their respective lengths, which are within 1000.

Output

An integer representing the minimum number of possible operations to transform any string x into a string y.

Sample Input

10 AGTCTGACGC

11 AGTAAGTAGGC

Sample Output

4

题目大意:给你2个字符串,要你求出一个字符串变到另一个字符串的最小次数。

解题思路:用DP。

d[i][j]表示长度为i的字符串变到长度为j的字符串的最小变换次数。

if(s1[i]=s2[j])

d[i][j]=d[i-1][j-1];

否则

d[i][j]=min(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+1);

代码:

 1 #include<iostream>
 2 #include<string>
 3 using namespace std;
 4 const int maxn=1000+10;
 5 int min(int x,int y)
 6 {
 7     if(x<y)
 8         return x;
 9     else return y;
10 }
11 int d[maxn][maxn];
12 int main()
13 {
14     string a,b;
15     int l1,l2,i,j;
16     while(cin>>l1>>a>>l2>>b)
17     {
18         for(i=0;i<=l1;i++)
19             for(j=0;j<=l2;j++)
20                 d[i][j]=0;
21             for(i=1;i<=l1;i++)
22                 d[i][0]=i;
23             for(j=1;j<=l2;j++)
24                 d[0][j]=j;
25             for(i=1;i<=l1;i++)
26             {
27                 for(j=1;j<=l2;j++)
28                 {
29                     if(a[i-1]==b[j-1])
30                         d[i][j]=d[i-1][j-1];
31                     else 
32                     {
33                         d[i][j]=min(d[i-1][j]+1,d[i][j-1]+1);
34                         d[i][j]=min(d[i][j],d[i-1][j-1]+1);
35                     }
36                 }
37             }
38             cout<<d[l1][l2]<<endl;
39     }
40     return 0;
41 }
View Code

 

posted on 2015-08-16 19:16  最爱剪刀手  阅读(210)  评论(0编辑  收藏  举报