zoukankan      html  css  js  c++  java
  • poj 3356

    AGTC
    Time Limit: 1000MS   Memory Limit: 65536K
    Total Submissions: 7934   Accepted: 3147

    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

    //t[i][j]表示第一个字符串的前i个字符要和第二个字符串的前j个字符匹配需要的最少操作次数   
    //初始化t[i][0]=i,若第二个字符串为0,只好把第一个字符串全删掉,所以t[i][0]=i   
    //同理,t[0][j]=j   
    //状态转移方程:若s1[i-1]==s2[j-1],则不需要操作,那么t[i][j]=t[i-1][j-1]   
    //否则,我们可能有三步操作,删除,插入,变换,所以t[i][j]=min(t[i-1][j]+1,t[i][j-1]+1,t[i-1][j-1]+1)   
    //把删除和插入看作是一个操作,自然t[i-1][j-1]+1对应的是变换了。
    #include<stdio.h>
    #include<string.h>
    
    char a[1010];
    char b[1010];
    int t[1010][1010],A,B;
    
    int main()
    {
        int i,j;
        while(scanf("%d%s%d%s",&A,a,&B,b)!=EOF)
        {
            memset(t,0,sizeof(t));
            for(i=0;i<=A;i++)
                t[i][0]=i;
            for(j=0;j<=B;j++)
                t[0][j]=j;
    
            for(i=1;i<=A;i++)
                for(j=1;j<=B;j++)
                {
                    if(a[i-1]==b[j-1]) t[i][j]=t[i-1][j-1];
                    else 
                    {
                        t[i][j]=t[i-1][j]+1<t[i-1][j-1]+1?t[i-1][j]+1:t[i-1][j-1]+1;
                        t[i][j]=t[i][j]<t[i][j-1]+1?t[i][j]:t[i][j-1]+1;
                    }
                }
                printf("%d\n",t[A][B]);
        }
        return 0;
    }
    
    
    
    
    
  • 相关阅读:
    linux服务器网络配置
    全面了解linux服务器
    centos selinux学习记录
    centos7使用samba共享文件
    centos7修改yum下载源为阿里源
    ubuntu14.04使用samba共享文件
    计算两个经纬度之间的距离(python算法)
    awk中的冒泡排序
    linux awk时间计算脚本
    linux shell中FS、OFS、RS、ORS图解
  • 原文地址:https://www.cnblogs.com/xiaofanke/p/3107023.html
Copyright © 2011-2022 走看看