UVA 1368 DNA Consensus String

本文介绍了一种算法,用于寻找一组DNA序列中使得Hamming距离之和最小的序列,并计算该序列与其它序列之间的总Hamming距离。通过统计各位置上不同核苷酸的出现次数,选择出现次数最多的核苷酸构成最优序列,进而计算总Hamming距离。

题意:先输入一个数代表接下来的输入数据的个数,然后输入m,n,表示有m个长度为n的字符串DNA序列。

要求输出:①使m个序列的hamming差最小的DNA序列

②输出m的序列的hamming总差值。

思路:①字符串输出:例如ATC,AGC,GCT,按需查找每个序列的相同位置的元素,

AAG,可得A出现是次数最多,第一个位置应该填A,

TGC,三个元素次数一样,按字典序输出,第二个位置为C,

CCT,可得第三个位置为C。

②hamming差值结果:第一个位置选A,则有2个元素不一样,hamming差值加2,

最后输出总的结果。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int main()
{
    int  num,m,n,i,j,k,max,diff=0;
    int  numA,numC,numG,numT,curDiff;
    char str[50][1000],c,resStr[1000];
    scanf("%d",&num);
    while(num--)
    {
         scanf("%d",&m);
         scanf("%d",&n);
         for(i=0;i<m;i++)
         {
             scanf("%s",&str[i]);
         }
         diff=0;
//         printf("print:\n");
//         for(i=0;i<m;i++)
//         {
//             printf("%s\n",str[i]);
//         }
         memset(resStr,'\0',sizeof(resStr));//刚刚忘了写这个就WA
         for(i=0;i<n;i++)
         {
              numA=0,numC=0,numG=0,numT=0,max=0;
             for(j=0;j<m;j++)
             {
                 switch (str[j][i])
                 {
                 case 'A':
                    numA++;
                    break;
                 case 'C':
                    numC++;
                    break;
                 case 'G':
                    numG++;
                    break;
                 case 'T':
                    numT++;
                    break;
                 }
             }
             curDiff=0;
            if(numA>=numC&&numA>=numG&&numA>=numT)
                {
                    resStr[i]='A';
                    curDiff=numC+numG+numT;
                }
            else if(numC>=numG&&numC>=numT)
                    {
                        resStr[i]='C';
                        curDiff=numA+numG+numT;
                    }
                else  if(numG>=numT)//numG>numA&&numG>numC
                        {
                            resStr[i]='G';
                            curDiff=numA+numC+numT;
                        }
                        else
                            {
                                resStr[i]='T'; //
                                curDiff=numA+numG+numC;
                            }
                diff=diff+curDiff;
         }
         printf("%s\n",resStr);
         printf("%d\n",diff);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值