1368 - DNA Consensus String

#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;

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值