zoukankan      html  css  js  c++  java
  • 洛谷1140 相似基因

    洛谷1140 相似基因

    本题地址: http://www.luogu.org/problem/show?pid=1140

    题目背景

    大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。 在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。

    题目描述

    两个基因的相似度的计算方法如下:
    对于两个已知基因,例如AGTGATG和GTTAG,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如:

    这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示:
     
    那么相似度就是:(-3)+5+5+(-2)+(-3)+5+(-3)+5=9。因为两个基因的对应方法不唯一,例如又有:

    相似度为:(-3)+5+5+(-2)+5+(-1)+5=14。规定两个基因的相似度为所有对应方法中,相似度最大的那个。

    输入输出格式

    输入格式:

    共两行。每行首先是一个整数,表示基因的长度;隔一个空格后是一个基因序列,序列中只含A,C,G,T四个字母。1<=序列的长度<=100。

    输出格式:

    仅一行,即输入基因的相似度。

    输入输出样例

    输入样例#1:

    7 AGTGATG

    5 GTTAG

    输出样例#1:

    14

     

     

    【思路】

      线性DP。

      可以类比于求最大公共子序列。设d[i][j]为到a串的i与b串的j为止的最大相似度。则有转移方程:

    d[i][j]=max{ d[i-1][j-1]+cost(a[i],b[j]),d[i][j-1]+cost(‘-’,b[j]),d[i-1][j]+cost(a[i],’-’) }

     

    需要注意的是初始化d[0][j]和d[i][0],另外字串右移一位读入方便处理。

    【代码】

     1 #include<cstdio>
     2 #include<iostream>
     3 using namespace std;
     4 
     5 const int maxn = 100+10;
     6 const int w[5][5]={ 
     7                   {5,-1,-2,-1,-3},
     8                   {-1,5,-3,-2,-4},
     9                   {-2,-3,5,-2,-2},
    10                   {-1,-2,-2,5,-1},
    11                   {-3,-4,-2,-1,-1<<30}
    12                 };
    13 int h[333],d[maxn][maxn];
    14 int n,m;
    15 char a[maxn],b[maxn];
    16 
    17 inline int cost(char x,char y) {
    18     return w[h[x]][h[y]];
    19 }
    20 
    21 int main() {
    22     h['A']=0; h['C']=1; h['G']=2; h['T']=3; h['-']=4;
    23     
    24     scanf("%d%s%d%s",&n,a+1,&m,b+1);
    25     for(int i=1;i<=n;i++) {  d[i][0]=d[i-1][0]+cost(a[i],'-'); }
    26     for(int j=1;j<=m;j++) {  d[0][j]=d[0][j-1]+cost('-',b[j]); }
    27     
    28     for(int i=1;i<=n;i++)
    29        for(int j=1;j<=m;j++){
    30               d[i][j]=d[i-1][j-1]+cost(a[i],b[j]);
    31               d[i][j]=max(d[i][j],d[i-1][j]+cost(a[i],'-'));
    32               d[i][j]=max(d[i][j],d[i][j-1]+cost(b[j],'-'));
    33        }
    34     printf("%d",d[n][m]);
    35     return 0;
    36 }
  • 相关阅读:
    hdu5360 Hiking(水题)
    hdu5348 MZL's endless loop(欧拉回路)
    hdu5351 MZL's Border(规律题,java)
    hdu5347 MZL's chemistry(打表)
    hdu5344 MZL's xor(水题)
    hdu5338 ZZX and Permutations(贪心、线段树)
    hdu 5325 Crazy Bobo (树形dp)
    hdu5323 Solve this interesting problem(爆搜)
    hdu5322 Hope(dp)
    Lightoj1009 Back to Underworld(带权并查集)
  • 原文地址:https://www.cnblogs.com/lidaxin/p/4889459.html
Copyright © 2011-2022 走看看