uva1368 (DNA Consensus String)
/*
本题题意:
输入n个长度均为m的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。、
两个等长字符串的Hamming距离等于字符不同的位置个数,eg: ACGT和GCGA的Hamming距离为2(左数第1, 4个字符不同)。
输入整数m和n(4≤m≤50, 4≤n≤1000),以及m个长度为n的DNA序列(只包含字母A,C,G,T),
输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多解,要求为字典序最小的解。
本题思路:
求出最短的序列和, 将所有的序列排列为一个矩阵, 取每列中出现最多的字符, 取出每列出现最多的字符 构成的序列
就是最短的Hamming距离, 字符最多, 那么Hamming距离就越小
具体实现看代码:
*/
#include<bits/stdc++.h> using namespace std; int c[4][1005]; int main() { int cnt, n, M; // M是给定序列的长度 map<char, int> m; char cha[4] = {'A', 'C', 'G', 'T'}; m['A'] = 0; m['C'] = 1; m['G'] = 2; m['T'] = 3; scanf("%d", &cnt); // 判断的组数 while(cnt--) { memset(c, 0, sizeof(c)); // fill(c[0] + 0, c[0] + 4 * 1005, 0); //需要初始化二维数组 scanf("%d%d", &n, &M); // n 行 M为序列的长度 getchar(); for(int i = 0; i < n; i++) { for(int j = 0; j < M; j++) { char letter; scanf("%c", &letter); // 输入字符 c[m[letter]][j]++; } getchar(); } int res = 0; // 记录最终的结果 for(int i = 0; i < M; i++) { int max = 0, u = 0; // 分别记录第i列序列中最大的字符数量与 cha字符的下标位置 for(int j = 0; j < 4; j++) { if(c[j][i] > max) { max = c[j][i]; u = j; // } } res += n - max; // 此处是行的高度 - 最大的字符数量求出ham距离 printf("%c", cha[u]); } printf("\n%d\n", res); } return 0; }