《算法竞赛入门经典》习题3-7 DNA序列

《算法竞赛入门经典》习题3-7 DNA序列

输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。两个等长字符串的Hamming距离等于字符不同的位置个数,例如,ACGT和GCGA的Hamming距离为2(左数第1,4个字符不同)。
输入整数m和n(4<=m<=50,4<=n<=1000),以及m个长度为nd DNAx序列(只包含字母A,C,G,T),输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多解,要求为字典序最小的解。例如,对于下面5个DNA序列,最优解为TAAGATAC。
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT

#include<stdio.h>
#include<string.h>
struct DNA
{  
    int a,c,g,t;             //定义结构体
}ch[1010];
int main()
{
    int m,n;
    while(scanf("%d %d",&m,&n)!=EOF)
    {
        char s[60][1010];
        char  ans[1010];
        for(int i=0;i<m;i++)
        {
            scanf("%s",s[i]);
        }
        int max;
        for(int i=0;i<n;i++)             /*竖着比较,那个字母出现的多,即为所求的字母*/   
        {
            ch[i].a=ch[i].c=ch[i].g=ch[i].t=0;
            for(int j=0;j<m;j++)     
            {
                if(s[j][i]=='A')  ch[i].a++;
                else if(s[j][i]=='C')  ch[i].c++;
                else if(s[j][i]=='G')  ch[i].g++;
                else if(s[j][i]=='T')  ch[i].t++;
            }
            max=0;
            if(max<ch[i].a) {ans[i]='A'; max=ch[i].a;}  //按字典序排
            if(max<ch[i].c) {ans[i]='C'; max=ch[i].c;}
            if(max<ch[i].g) {ans[i]='G'; max=ch[i].g;}
            if(max<ch[i].t) {ans[i]='T'; max=ch[i].t;}
        }
        printf("%s\n",ans);
    }
    return 0;
}

一开始看错题了,后来发现是求一个序列,不是找一个序列。
(私はあきらめない)

猜你喜欢

转载自blog.csdn.net/weixin_43326028/article/details/83649935