题目大意:给定m个长度为n的DNA序列,求一个DNA序列,使其到所有DNA序列的hamming距离尽量小,如有多组解,输出字典序最小的。(hamming距离定义为两个等长的字符串,字符不同的位置个数)。
题目思路:找hamming距离最小的字符串,即统计每个位置上A,C,T,G最多的字符组成的字符串。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1010
#define INF 0xfffffff
char map[51][MAX];
char s[MAX];
char ans[]="ACGT";
int n,m,cnt;
int check(int x)
{
int i,j,sum=-1;
int a[5];
memset(a,0,sizeof(a));
for (i=0;i<n;i++)
{
if (map[i][x]=='A')
{
a[0]++;
}
else if (map[i][x]=='C')
{
a[1]++;
}
else if (map[i][x]=='G')
{
a[2]++;
}
else if (map[i][x]=='T')
{
a[3]++;
}
}
for (i=0;i<4;i++)
{
if (sum<a[i])
{
sum=a[i];
j=i;
}
}
s[x]=ans[j];
return n-sum;
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
int i,j;
scanf("%d%d",&n,&m);
cnt=0;
for (i=0;i<n;i++)
{
scanf("%s",map[i]);
}
for (i=0;i<m;i++)
{
cnt+=check(i);
}
s[m]='\0';
printf("%s\n%d\n",s,cnt);
}
}