【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108476
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

  【问题描述】

大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。

在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。两个基因的相似度的计算方法如下:

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

A

G

T

G

A

T

-

G

-

G

T

-

-

T

A

G

这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示:

 

A

C

G

T

-

A

5

-1

-2

-1

-3

C

-1

5

-3

-2

-4

G

-2

-3

5

-2

-2

T

-1

-2

-2

5

-1

-

-3

-4

-2

-1

*

那么相似度就是:(-3)+5+5+(-2)+(-3)+5+(-3)+5=9。因为两个基因的对应方法不唯一,例如又有:

A

G

T

G

A

T

G

-

G

T

T

A

-

G

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

【输入文件】

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

 

【输出文件】

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

【输入输出样例】

输入:

7 AGTGATG
5 GTTAG

输出:
14

【参考程序】:

#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int p[5][5]={
{5,-1,-2,-1,-3},
{-1,5,-3,-2,-4},
{-2,-3,5,-2,-2},
{-1,-2,-2,5,-1},
{-3,-4,-2,-1,0},
};
int a[101],b[101],opt[101][101];
int len1,len2;
char s1[102],s2[102];
int find_max(int x,int y,int z)
{
        int k=x;
        if (k<y) k=y;
        if (k<z) k=z;
        return k;
}
void work()
{
        memset(opt,128,sizeof(opt));
        opt[0][0]=0;
        for (int i=1;i<=len1;i++)
                opt[i][0]=opt[i-1][0]+p[a[i]][4];
        for (int i=1;i<=len2;i++)
                opt[0][i]=opt[0][i-1]+p[4][b[i]];
        for (int i=1;i<=len1;i++)
                for (int j=1;j<=len2;j++)
                {
                        int x=opt[i-1][j-1]+p[a[i]][b[j]],
                            y=opt[i-1][j]+p[a[i]][4],
                            z=opt[i][j-1]+p[4][b[j]];
                        opt[i][j]=find_max(x,y,z);
                }
        printf("%d\n",opt[len1][len2]);
}
int main()
{
        freopen("gene.in","r",stdin);
        freopen("gene.out","w",stdout);
        char cc;
        scanf("%d ",&len1);
        for (int i=1;i<=len1;i++)
        {
                scanf("%c",&cc);
                if (cc=='A') a[i]=0;
                else if (cc=='C') a[i]=1;
                else if (cc=='G') a[i]=2;
                else if (cc=='T') a[i]=3;
        }
        getchar();
        scanf("%d ",&len2);
        for (int i=1;i<=len2;i++)
        {
                scanf("%c",&cc);
                if (cc=='A') b[i]=0;
                else if (cc=='C') b[i]=1;
                else if (cc=='G') b[i]=2;
                else if (cc=='T') b[i]=3;
        }
        work();
        return 0;
}


 

posted on 2009-04-17 15:44 开拓者 阅读(467) 评论(0)  编辑 收藏 引用 所属分类: 动态规划&背包经典习题

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理