1. 程式人生 > >Uva1368 DNA序列

Uva1368 DNA序列

題意:輸入m個長度均為n的DNA序列,求一個DNA序列,到所有序列的總Hamming距離儘量小。兩個等長字串Haming距離等於字元不同位置個數,例如,ACGT和GCGA的Hamming距離為2(左邊第1,4字元不同)。

題解:用一個二維陣列存輸入的DNA序列,求出陣列每一列出現最先次數最多的字元,這些字元的組成序列就是所求的DNA序列,Hamming距離,每一列與出現最多的字元不同的個數之和。

#include<iostream>
#include<map>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
const int maxn = 1010;
const int maxm = 55;
const string temp = "ACGT";
int m, n, t;
int num[4][maxn];
string s;
int main(){
	freopen("data.in", "r", stdin);
	scanf("%d", &t);
	while(t--){
		scanf("%d%d", &m, &n);
		fill(num[0], num[0] + 4*maxn, 0);
		for(int i = 0; i < m; ++i){
			cin >> s;
			for(int j = 0; j < n; ++j){
				switch(s[j]){
					case 'A' : num[0][j]++; break;
					case 'C' : num[1][j]++; break;
					case 'G' : num[2][j]++; break;
					case 'T' : num[3][j]++; break;
				}
			}
		}
		int cnt = 0;
		string t = "";
		for(int j = 0; j < n; ++j){
			int index = 0;
			for(int i = 0; i < 4; ++i){
				if(num[index][j] < num[i][j]){
					index = i;
				}
			}
			cnt += (m - num[index][j]);
			t = t + temp[index];
		}
		cout << t << endl << cnt << endl;
	}
	return 0;
}