zoukankan      html  css  js  c++  java
  • POJ3356 AGTC (最短编辑距离问题)

    AGTC
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 7923   Accepted: 3142

    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 nm.

    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

    Source

     
    题意:
    由字符串 s1 通过下列三种操作
     1、插入一个字符;
       2、删除一个字符;
     3、改变一个字符
    变换到字符串 s2 所需要的最少操作次数(亦即最短编辑距离问题)

    解析:

    第三届软件大赛决赛中关于核苷酸 变换的问题解析http://blog.csdn.net/kuaisuzhuceh/article/details/8680799如下(同样也适用于该题);
    状态转移方程:
    有三种情况可以导致我们上面设计的状态会发生转移。我们现在来看A[i] 和 B[j] ,
    ①、我们可以在 B[j]后面插入一个核苷酸(即一个字符)ch,ch==A[i],这样做的话,
    至少需要 dp[i - 1][j] + 1步操作,即 dp[i][j] = dp[i - 1][j] + 1。
    ②、我们可以删除 B[j],这样的话,B[1...j] 变为A[1...i] 需要 dp[i][j - 1]步,
    即 dp[i][j] = dp[i][j - 1] + 1。
    ③、我们也可以考虑修改 B[j],使它变为A[j],但是如果 B[j]本来就等于 A[i]的话,
    那修改其实相当于用了 0步,如果 B[j] != A[i] 的话,那修改相当于用了 1步。
    所以 dp[i][j] = dp[i - 1][j - 1] + (A[i] == B[j] ? 0, 1)。

    决策:
    决策就很简单了,从上面三种状态转移中选择一个最小值就可以了。

    处理边界:
    处理好边界非常重要,这里需要注意的是对dp[0][0....m],dp[0.....n][0]的初始化,
    可以这样看,dp[0][i],就是说A[1...n]是一个空串,而B[1...m]十个长度为i的串,
    很显然B串变为A串就是删除i个核苷酸。

     1 #include <cstdio>
     2 #include <iostream>
     3 #include <cstring>
     4 
     5 using namespace std;
     6 
     7 int len1, len2;
     8 int dp[1005][1005];//  dp[i][j] 表示 s1[0...i-1]变换到  s2[0...j-1] 的最短编辑距离 
     9 char s1[1005], s2[1005];
    10 
    11 inline int min(int a, int b)
    12 {
    13     return a < b ? a : b;
    14 }
    15 
    16 inline int max(int a, int b)
    17 {
    18     return a > b ? a : b;
    19 }
    20 
    21 void init()
    22 {
    23     memset(dp, 0, sizeof(dp));
    24     int tmp = max(len1, len2);
    25     for(int i = 1; i <= tmp; ++i)  // 注意初始化 
    26     {
    27         dp[i][0] = dp[0][i] = i;
    28     }
    29 }
    30 
    31 int DP()
    32 {
    33     for(int i = 0; i < len1; ++i)
    34         for(int j = 0; j < len2; ++j)
    35         {
    36             if(s1[i] == s2[j])
    37                 dp[i+1][j+1] = min(min(dp[i+1][j]+1, dp[i][j+1]+1), dp[i][j]);
    38             else 
    39                 dp[i+1][j+1] = min(min(dp[i+1][j]+1, dp[i][j+1]+1), dp[i][j]+1); 
    40         }
    41     return dp[len1][len2];
    42 }
    43 
    44 int main()
    45 {
    46     while(cin >> len1 >> s1)
    47     {
    48         cin >> len2 >> s2;
    49         init();
    50         cout << DP() << endl;
    51     }
    52     return 0;
    53 }
  • 相关阅读:
    Chapter 03Using SingleRow Functions to Customize Output(03)
    Chapter 03Using SingleRow Functions to Customize Output(01)
    Chapter 04Using Conversion Functions and Conditional ExpressionsNesting Functions
    Chapter 04Using Conversion Functions and Conditional ExpressionsGeneral Functions
    Chapter 11Creating Other Schema Objects Index
    传奇程序员John Carmack 访谈实录 (zz.is2120)
    保持简单纪念丹尼斯里奇(Dennis Ritchie) (zz.is2120.BG57IV3)
    王江民:传奇一生 (zz.is2120)
    2011台湾游日月潭
    2011台湾游星云大师的佛光寺
  • 原文地址:https://www.cnblogs.com/dongsheng/p/3102498.html
Copyright © 2011-2022 走看看