Uva1368 DNA序列
阿新 • • 發佈:2018-11-03
題意:輸入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; }