UVa 1368 DNA序列

重点是想到如何使Hamming距离最小——分别检索每一列,取出各列出现频率最高的字母即可。
代码如下:

#include <iostream>
using namespace std;
char s[55][110];
char maxs[110];
char maxs_4(int a, int b, int c, int d) {
	if (a >= b && a >= c && a >= d)
		return 'A';
	else if (d > a && d >= b && d >= c)
		return 'C';
	else if (c > a && c >= b && c > d)
		return 'G';
	else if (b > a && b > c && b > d)
		return 'T';
	else
		return 0;
}
int main() {
	int m, n, T, i, j;
	cin >> T;
	while (T--) {
		int sum = 0;
		cin >> m >> n;
		for (i = 0; i < m; i++) {
			cin >> s[i];
		}
		for (i = 0; i < n; i++) {
			int a = 0, t = 0, g = 0, c = 0;
			for (j = 0; j < m; j++) {
				switch (s[j][i]) {
				case 'A':a++; break;
				case 'T':t++; break;
				case 'G':g++; break;
				case 'C':c++; break;
				default:break;
				}
			}
			maxs[i] = maxs_4(a, t, g, c);
		}
		int len = i;
		for (i = 0; i < m; i++) {
			for (j = 0; j < n; j++) {
				if (maxs[j] != s[i][j])
					sum++;
			}
		}
		for (i = 0; i < len; i++) {
			cout << maxs[i];
		}
		cout << endl << sum << endl;
	}
	return 0;
}
发布了7 篇原创文章 · 获赞 0 · 访问量 51

猜你喜欢

转载自blog.csdn.net/qq_21606413/article/details/104958529