• POJ-3356 AGTC (最短编辑距离问题)


    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87125#problem/C

    题意:   

    由字符串 x 通过下列三种操作
     1、插入一个字符;
       2、删除一个字符;
     3、改变一个字符
    变换到字符串 y 所需要的最少操作次数
    案例:      

         Input

     

         11 AGTAAGTAGGC

         Output

         4

    思路分析:

           状态转移有以下三种情况

             1)可以在y[i]后面插入一个数,即d[i-1][j]+1;

             2)可以在y[i]后面插入一个数,即d[i][j-1]+1;

             3)还有就是看它是否相等,即d[i-1][j-1]+(x[i-1]!=y[j-1]);

             所以公式为d[i][j]=min(d[i-1][j]+1,d[i][j-1]+1,d[i-1][j-1]+(x[i-1]!=y[j-1]))。

             处理好边界非常重要,这里需要注意的是对d[0....m][0],d[0][0.....n]的初始化,d[0][j]就是说x[0]是个空串,而y[n]是长度为j的串,让x串变为y串就是删除i个核苷酸。

    源代码如下:

     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #define MAX 1010
     6 using namespace std;
     7 char x[MAX],y[MAX];
     8 int d[MAX][MAX];
     9 int main()
    10 {
    11     int m,n,i,j;
    12 while(scanf("%d",&m)!=EOF){  
    13         scanf("%s",x);  
    14     scanf("%d %s",&n,y);
    15     for(i=0;i<=m;i++)
    16         d[i][0]=i;             //边界处理
    17     for(j=0;j<=n;j++)
    18         d[0][j]=j;             //边界处理
    19     for(i=1;i<=m;i++)                    //状态转移
    20         for(j=1;j<=n;j++)
    21         {
    22             d[i][j]=min(d[i-1][j]+1,d[i][j-1]+1);        
    23             d[i][j]=min(d[i][j],d[i-1][j-1]+(x[i-1]!=y[j-1]));
    24         }
    25     printf("%d
    ",d[m][n]);
    26 }
    27     return 0;
    28 }

     

           

           

  • 相关阅读:
    routing路由模式
    MQ的订阅模式
    RabbitMq中的消息应答与持久化
    work工作消息队列Round-robin与Fair dispatch
    040 关于hive元数据的解析
    simple简单消息队列
    用户设置与virtual host配置
    Mq的介绍
    字典
    元组Tuple
  • 原文地址:https://www.cnblogs.com/q-c-y/p/4731256.html
Copyright © 2020-2023  润新知