DNA Consensus String UVa 1368
—————————————————————————
题目:UVa 1368
—————————————————————————
思路:对输入的每一列,记录出现次数最多的字符存入ans数组中,设初始Hamming长度l=m*n(假设输入的所有字符都不一样),当获取完每一列出现最多的次数时将l减去次数,最终结果即为最小Hamming距离。
PS:Hamming距离即为等长字符串对应位置的不同字符个数。
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
#include <bits/stdc++.h>
#define maxn 1005
using namespace std;
int main(){
int T;
scanf("%d", &T);
while(T--) {
int m, n;
char ans[maxn] = {0};
scanf("%d%d", &m, &n);
int l = m*n;
char a[m][n];
getchar();
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
scanf("%c", &a[i][j]);
}
getchar();
}
for(int j = 0; j < n; j++) {
int sum[4] = {0};
for(int i = 0; i < m; i++) {
switch(a[i][j]) {
case 'A': sum[0]++; break;
case 'C': sum[1]++; break;
case 'G': sum[2]++; break;
case 'T': sum[3]++; break;
}
}
int max = 0;
char tmp;
for(int i = 1; i < 4; i++) {
if(sum[i]>sum[max])
max = i;
}
l -= sum[max];
switch(max) {
case 0: tmp = 'A'; break;
case 1: tmp = 'C'; break;
case 2: tmp = 'G'; break;
case 3: tmp = 'T'; break;
}
ans[j] = tmp;
}
for(int i = 0; i < n; i++) {
printf("%c", ans[i]);
}
printf("\n%d\n", l);
}
return 0;
}