题意:
输入m个长度均为n的DNA序列, 求一个DNA序列, 到所有序列的总Hamming距离尽量小。 两个等长字符串的Hamming距离等于字符不同的位置个数, 例如, ACGT和GCGA的Hamming距离为2(左数第1, 4个字符不同) 。
输入整数m和n(4≤m≤50, 4≤n≤1000) , 以及m个长度为n的DNA序列(只包含字母A, C, G,T) , 输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。 如有多解, 要求为字典序最小的解。 例如, 对于下面5个DNA序列, 最优解为TAAGATAC。
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
解析:要求Hamming距离距离最小,只要输出每一列字母中出现次数最多的字母,就是题目要求的最优解。
#include<stdio.h>
#include<string.h>
int main()
{
char s[55][1005];
int T,m,n;
scanf("%d",&T);
while(T--)
{
int sum=0,sum1;
scanf("%d%d",&m,&n);
for(int i=0;i<m;i++)
scanf("%s",s[i]);
int num[5]; //记录每一列中4个字母出现的次数
int max,maxd; //记录最多的次数,以及对应的下标
for(int j=0;j<n;j++) //j为列
{
memset(num,0,sizeof(num));
for(int i=0;i<m;i++) //i为行
{
if(s[i][j]=='A') num[0]++;
if(s[i][j]=='C') num[1]++;
if(s[i][j]=='G') num[2]++;
if(s[i][j]=='T') num[3]++;
}
max=num[0];
maxd=0;
for(int k=1;k<4;k++)
{
if(max<num[k])
{
max=num[k];
maxd=k;
}
}
sum1=0;
for(int k=0;k<4;k++)
{
if(k==maxd) continue;
else sum1+=num[k];
}
sum+=sum1;
if(maxd==0) putchar('A');
if(maxd==1) putchar('C');
if(maxd==2) putchar('G');
if(maxd==3) putchar('T');
}
printf("\n%d\n",sum);
}
return 0;
}