zoukankan      html  css  js  c++  java
  • 【题解搬运】蓝桥杯2012年第4题题解

    从我原来的博客上搬运。原先blog作废。

    题目

    脱氧核糖核酸即常说的DNA,是一类带有遗传信息的生物大分子。它由4种主要的脱氧核苷酸(dAMP、dGMP、dCMT和dTMP)通过磷酸二酯键连接而成。这4种核苷酸可以分别记为:A、G、C、T。

    DNA携带的遗传信息可以用形如:AGGTCGACTCCA…. 的串来表示。DNA在转录复制的过程中可能会发生随机的偏差,这才最终造就了生物的多样性。

    为了简化问题,我们假设,DNA在复制的时候可能出现的偏差是(理论上,对每个碱基被复制时,都可能出现偏差):

    漏掉某个脱氧核苷酸。例如把 AGGT 复制成为:AGT

    错码,例如把 AGGT 复制成了:AGCT

    重码,例如把 AGGT 复制成了:AAGGT

    如果某DNA串a,最少要经过 n 次出错,才能变为DNA串b,则称这两个DNA串的距离为 n。

    例如:AGGTCATATTCC 与 CGGTCATATTC 的距离为 2

    你的任务是:编写程序,找到两个DNA串的距离。

    题解

    此题原型即最短编辑距离,用dp解决。
    不妨设两串分别为$str_a,str_b$,长度分别为$m,n$,设$dp[i][j]$为$a$串的长度为$i$的前缀字串和$b$串的长度为$j$的前缀子串,那么原题即求$dp[m-1][n-1]$。
    下面是转移方程:
    $$
    dp[i][j]=left{
    egin{aligned}
    dp[i-1][j-1] & , & a[i]=b[j] \
    min{dp[i-1][j]+1,dp[i][j-1]+1,dp[i-1][j-1]+1}& , & a[i] e b[j]
    end{aligned}
    ight.
    $$

    理解问题应当出现在第二个式子上。我们以b串为母串,那么一、二、三子式分别对应重复、删除、修改这三种情况。

    特别地,边界条件:$dp[i][0]=i,dp[0][j]=j$。

    为何呢?因为从i长度变为空串总要i次操作。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    #define f1(x,y) for(int x=1;x<=y;++x)
    #define f0(x,y) for(int x=0;x!=y;++x)
    #define bf1(x,y,z) for(int x=y;x>=z;--x)
    #define bf0(x,y,z) for(int x=y;x!=z;--x)
    typedef long long ll;
    typedef unsigned long long ull;
    int dp[10005][10005];
    int main()
    {
        int n; cin>>n;
        while(n--)
        {
            string a,b;
            cin>>a>>b;
            int alen=a.length(),
                blen=b.length();
            memset(dp,0x3f,sizeof(dp));
            for(int i=0;i!=alen;++i)
                dp[i][0]=i;
            for(int i=0;i!=blen;++i)
                dp[0][i]=i;
            dp[0][0]=0;
            for(int i=0;i!=alen;++i)
                for(int j=0;j!=blen;++j)
                {
                    if(a[i]==b[j])
                    {
                        if(i-1>=0&&j-1>=0)
                            dp[i][j]=dp[i-1][j-1];
                    }
                    else
                    {
                        if(i-1>=0)
                        {
                            dp[i][j]=min(dp[i][j],dp[i-1][j]+1);
                            if(j-1>=0)
                            {
                                dp[i][j]=min(dp[i][j],dp[i][j-1]+1);
                                dp[i][j]=min(dp[i][j],dp[i-1][j-1]+1);
                            }
                        }
                        else
                        {
                            if(j-1>=0) dp[i][j]=min(dp[i][j],dp[i][j-1]+1);
                        }
                    }
                }
            cout<<dp[alen-1][blen-1]<<endl;
        }
        return 0;
    }
    如非注明,原创内容遵循GFDLv1.3发布;其中的代码遵循GPLv3发布。
  • 相关阅读:
    android29
    android28
    android27
    android26
    Dynamics CRM2011 MspInstallAction failed when installing an Update Rollup
    Dynamics CRM Import Solution Attribute Display Name description is null or empty
    The service cannot be activated because it does not support ASP.NET compatibility
    IIS部署WCF报 无法读取配置节“protocolMapping”,因为它缺少节声明
    Unable to access the IIS metabase.You do not have sufficient privilege
    LM算法与非线性最小二乘问题
  • 原文地址:https://www.cnblogs.com/samhx/p/9652099.html
Copyright © 2011-2022 走看看