《算法竞赛入门经典》习题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;
}
一开始看错题了,后来发现是求一个序列,不是找一个序列。
(私はあきらめない)