题意翻译
输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。两个等长字符串的Hamming距离等于字符不同的位置个数,如ACGT和GCGA的Hamming距离为22(左数第11、44个字符不同)。
输入整数m和n(4≤m≤50,4≤n≤1000),以及m个长度为nn的DNA序列,(只包含字母A、C、G、T),输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多解,要求字典序最小的解。
输入输出样例
Sample Input
3
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA
6 10
ATGTTACCAT
AAGTTACGAT
AACAAAGCAA
AAGTTACCTT
AAGTTACCAA
TACTTACCAA
Sample Output
TAAGATAC
7
ACGTACGTAA
6
AAGTTACCAA
12
思路
记录每一列的每一个A,G,C,T的数量,找到每一列的最大值,用行数减去这一列的最大值,就是Hamming距离,如果有多个解,按照字典序小的来选择,注意输出格式.
代码
#include <stdio.h>
#include <string.h>
char str[55][1005];
// 只有4个字符,这里我使用26个字母的顺序来记录
int arr[1005][30];
int main() {
int T;
scanf("%d", &T);
while (T--) {
int r;
int c;
// 注意初始化
memset(arr, 0, sizeof(arr));
memset(str, ' ', sizeof(str));
scanf("%d%d", &r, &c);
for (int i = 0; i < r; i++) {
scanf("%s", str[i]);
for (int j = 0; j < c; j++) {
// 记录数量
arr[j][str[i][j] - 'A']++;
}
}
int max;
// 记录距离
int num = 0;
for (int i = 0; i < c; i++) {
// 初始化max为-1,便与判断
max = -1;
char c;
for (int j = 0; j < 30; j++) {
if (arr[i][j] > max) {
max = arr[i][j];
// 得到输出字符
c = j + 'A';
}
}
// 因为我选择用26个字母顺序来记录,所以数组只有4个字母有效
if (max > 0)
num = num + r - max;
printf("%c", c);
}
printf("\n");
printf("%d\n", num);
}
return 0;
}