2016-07-11
UVA-1368 DNA Consensus String
题目大意:输入 m 个长度均为 n 的 DNA 序列,求一个 Hamming 距离最小的序列,即最相似的序列,多解要求字典序最小。并输出距离。Hamming 距离等于字符不同的位置个数。
解题思路:将DNA序列存储在二位数组中,对每一列进行统计,直接输出出现次数最多的字符,并记录其他字符的个数。
#include <iostream>
#include <string.h>
using namespace std;
int main () {
char DNA[500][1000];
int a;
cin >> a;
while ( a-- ) {
int m , n;
char re[1000];
memset ( re, '\0', sizeof(re));
int sum = 0;
cin >> m >> n;
for ( int i = 0; i < m; i++)
for ( int j = 0; j < n; j++)
cin >> DNA[i][j];
for ( int j = 0; j < n; j++) {
int a[4];
memset ( a, 0, sizeof(a));
for ( int i = 0; i < m; i++)
switch ( DNA[i][j] ) {
case 'A': a[0]++; break;
case 'C': a[1]++; break;
case 'G': a[2]++; break;
case 'T': a[3]++; break;
}
int max = a[0];
int temp = 0;
for ( int i = 1; i < 4; i++)
if ( max < a[i] ) {
max = a[i];
temp = i;
}
sum += (m - max);
switch ( temp ) {
case 0: re[j] = 'A'; break;
case 1: re[j] = 'C'; break;
case 2: re[j] = 'G'; break;
case 3: re[j] = 'T'; break;
}
}
cout << re << endl << sum << endl;
}
return 0;
}