题目链接:点击打开链接
题目大意:给定m个长度均为n的DNA序列,求一个DNA序列,使它到所有序列的总Hamming距离尽量小.如果有多个解,输出字典序最小的解.
思路: 字符串遍历
分析:
1. Hamming距离就是不同的字符的个数.要使Hamming距离最小,那么对于目标DNA的每个位置,可以遍历所有m个序列的该位置,找到出现次数最多的碱基,就是这个位置的字符.这样以来,目标DNA和所有DNA不同字符的个数就能够达到最小.
2. 如果某个位置出现次数最多的字符有多个,选字典序小的那个,这样解的字典序就最小.
代码:
#include <iostream>
#include <string>
#include <cstdio>
#include <memory.h>
using namespace std;
const int maxm = 50 + 5;
const char* element = "ACGT";
string dna[maxm];
int m, n, diff;
string solve()
{
int times[4], i, j;
string ret = "";
for (i = 0; i < n; ++i)
{
memset(times, 0, sizeof(times));
for (j = 0; j < m; ++j)
{
switch(dna[j][i])
{
case 'A':
++times[0];
break;
case 'C':
++times[1];
break;
case 'G':
++times[2];
break;
case 'T':
++times[3];
break;
}
}
char maxc = element[0];
int maxt = times[0];
for (j = 1; j < 4; ++j)
if (times[j] > maxt)
{
maxt = times[j];
maxc = element[j];
}
ret += maxc;
diff += m - maxt;
}
return ret;
}
int main()
{
int kase;
scanf("%d", &kase);
while (kase--)
{
diff = 0;
scanf("%d %d", &m, &n);
for (int i = 0; i < m; ++i)
cin >> dna[i];
cout << solve() << endl;
printf("%d\n", diff);
}
return 0;
}