详细解答Uva - 1368 - DNA Consensus String

来源:互联网 发布:故宫淘宝官方微博 编辑:程序博客网 时间:2024/05/16 01:48

这道题目的题意其实很简单,只是让Uva用英语解释了一遍就似乎很复杂了。。

题目大意:

给定m行n列的DNA序列,只由AGCT四个字母组成。求出一个长度为n的序列使其与给定的每行DNA相似度最高。更明白的说就是每一列出现次数最多的就是要求的对应这一列的字母,如果存在相同数量的字母,按照字典顺序排序。

例如:

T A T G A T A C
T A A G C T A C
A A A G A T C C
T G A G A T A C
T A A G A T G T

↓  ↓  ↓ ↓  ↓  ↓ ↓  ↓

T A A G A T A C

================字典顺序: A-T-C-G

A C G T A C G T A C
C C G T A C G T A G
G C G T A C G T A T
T C  G T A C G T A A

↓  ↓   ↓  ↓ ↓  ↓  ↓  ↓ ↓  ↓ 

A C  G T A C G T A A

至于不相似度就是你求出的这个字母与这一列字母不相同的个数相加,比如第二个例子,第一个A与第一列2.3.4行都不同,那么列不相似度是3,以此类推,每列相加就是不相似度。

下面是代码  --【Az】


#include <stdio.h>#include <stdlib.h>char DNA[55][1005];int findmost(char DNA[55][1005],int hang,int i){    int a,t,c,g,k;    a = t = c = g = 0;    for(k = 0;k < hang;k++)    {        if(DNA[k][i] == 'A')            a++;        else if(DNA[k][i] == 'G')            g++;        else if(DNA[k][i] == 'C')            c++;        else if(DNA[k][i] == 'T')            t++;    }
//下面的部分就是这一题的核心,可以称作贪心法,对吧?
    if(a >= g && a >= c && a >= t)        {printf("A");return g+c+t;}    else if(c > a && c >= g && c >= t)        {printf("C");return a+g+t;}    else if(g > a && g > c && g >= t)        {printf("G");return a+c+t;}    else if(t > a && t > g && t > c)        {printf("T");return a+c+g;}}int main(){    int  num;    scanf("%d",&num);    int pt;    for(pt = 0;pt < num;pt++)    {        int hang,lie,i,j;        scanf("%d%d",&hang,&lie);        getchar();        for(i = 0; i < hang; i++)        {            for(j = 0; j < lie; j++)            {                DNA[i][j] = getchar();            }            getchar();        }        int diff = 0;        for(i = 0;i < lie;i++)        {            diff += findmost(DNA,hang,i);     //with the function of print;我编写的这个函数带输出功能。【Az】        }        printf("\n%d\n",diff);    }    return 0;}


0 0
原创粉丝点击