1368 - DNA Consensus String

来源:互联网 发布:跳跃网络 徐智阳 电话 编辑:程序博客网 时间:2024/06/04 23:22
#include<stdio.h>
#include<string.h>
char s[100][2000];


int main()
{
    int N,j,m,n,i,e,q;
    char p;
    scanf("%d",&N);
    for(e=0;e<N;e++)


      {




        scanf("%d%d",&m,&n);
        int A=0,T=0,G=0,C=0;//初始化
        for(i=0;i<m;i++)
            scanf("%s",s[i]);
        q=0;
        for(i=0;i<n;i++)//n代表每个序列的长度
        {
            for(j=0;j<m;j++)//m代表DNA串数
            {


                switch(s[j][i])
                {
                    case 'A':A+=1;break;             //统计每列的字母出现次数
                    case 'T':T+=1;break;
                    case 'G':G+=1;break;
                    case 'C':C+=1;break;
                }
            }
            if(A>=T&&A>=G&&A>=C)                //打印出现次数最多的和字典序最小的字母
            {printf("A");p='A';}
            else if(T>A&&T>G&&T>C)
             {printf("T");p='T';}
            else if(G>A&&G>C&&G>=T)
              {printf("G");p='G';}
            else if(C>A&&C>=T&&C>=G)
                {printf("C");p='C';}
                A=T=G=C=0;            //千万别忘了重新初始化
          int t;

          for(t=0;t<m;t++)

          {


//用q来统计Hamming距离

              if(p!=s[t][i])
               q+=1;
          }
          if(i==n-1)
            printf("\n%d\n",q);






        }




    }
    return 0;

}

解题的关键是怎么找这个最小的序列,只需要按列统计每列出现次数最多的字母就是要找的字母,每列都找到就找到最小序列了。

0 0
原创粉丝点击