zoukankan      html  css  js  c++  java
  • poj 3356

    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
    题意:
    求由字符串s1,通过下列三种操作:
    1.插入一个字符
    2.删除一个字符
    3.改变一个字符
    变换的字符s2所须要 的最小操作次数。
    思路:这是一个求编辑最短距离问题。利用动态规划,列出状态方程,设dp[i][j]表示字符串x[1...i]和字符串y[1...j]的最短编辑距离当x[i] == y[j]时,i和j不须要编辑,要么删除,要么插入。要么替换dp[i][j] = min(dp[i-1][j-1], dp[i-1][j] + 1, dp[i][j - 1] + 1)当x[i] != y[i]时, i和j不须要编辑dp[i][j] = min(dp[i-1][j-1] + 1, dp[i-1][j] + 1, dp[i][j-1] + 1);注意初始化dp[i][0] = dp[0][i] = i;
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    const int maxn = 1010;
    char strx[maxn], stry[maxn];
    int lenx, leny, dp[maxn][maxn];
    int main()
    {
    
        while( scanf("%d %s", &lenx, strx  + 1) != EOF)
        {
            scanf("%d %s", &leny, stry + 1);
            int maxv = max(lenx, leny);
            dp[0][0] = 0;
            for(int i = 1; i <= maxv; i++)
                dp[0][i] = dp[i][0] = i;
            for(int i = 1; i <= lenx; i++)
            {
                for(int j = 1; j <= leny; j++)
                {
                    dp[i][j] = min(dp[i-1][j] + 1, dp[i][j-1] + 1);
                    if(strx[i] == stry[j])
                        dp[i][j] = min(dp[i][j], dp[i-1][j-1]);
                    else
                        dp[i][j] = min(dp[i][j], dp[i-1][j-1] + 1);
                }
            }
            printf("%d
    ", dp[lenx][leny]);
        }
    
        return 0;
    }
    



  • 相关阅读:
    JavaScript实现类的private、protected、public、static以及继承
    OSS网页上传和断点续传(STSToken篇)
    OSS网页上传和断点续传(OSS配置篇)
    Linq sum()时遇到NULL
    SQLSERVER事务日志已满 the transaction log for database 'xx' is full
    笔记本高分辨软件兼容问题,字体太小或模糊
    H5上传图片之canvas
    An error occurred while updating the entries. See the inner exception for details.
    无限级结构SQL查询所有的下级和所有的上级
    SQLserver 进程被死锁问题解决
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7079999.html
Copyright © 2011-2022 走看看