Problem
http://write.blog.csdn.net/postlist
Thinking
題意為給定很多個字串, 找出一個字串跟這些字串hamming distance的加總最小, 並印出此hamming distance加總
假如有五個字串如下
12345678
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
--------
TAAGATAC
為什麼TAAGATAC
為解答,仔細看
- 第一個column,
T
是最多的 - 第二個column,
A
是最多的 - 第三個column,
A
是最多的 - 第三個column,
G
是最多的
etc...
所以做法就是遍歷每一個column的時候, 用一個table
記錄ACTG
個別出現次數, 並找出常出現的
Solution
//uva 1368 DNA Consensus String
#include<iostream>
typedef enum{A=0,C=1,G=2,T=3}e;
char DNAChar[4] = {'A','C','G','T'};
using namespace std;
int main()
{
int testcase;
cin >> testcase;
while(testcase > 0)
{
//initialize
int m,length;
cin >> m >> length;
string *DNAs = new string[m];
string AnsDNA;
int HammingDist = 0;
for(int i = 0 ; i < m ; i++)
cin >> DNAs[i];
for(int i = 0 ; i < length ; i++)
{
//使用table計算ACTG個數
int table[4] = {0};
for(int j = 0; j < m ; j++)
{
switch (DNAs[j][i])
{
case 'A':
table[A]++;
break;
case 'C':
table[C]++;
break;
case 'G':
table[G]++;
break;
case 'T':
table[T]++;
break;
default:
break;
}//end of switch
}//end of j
//find max element and max element index
/*因為ACTG本身就是字典排列, 所以就算table統計出來都一樣, max一樣是取字典順序最小的, 若ACTG統計結果個數皆一樣, 以下程式則會取A */
int maxChar = 0;
for(int j = 0 ; j < 4 ; j++)
{
if(table[maxChar] < table[j])
maxChar = j;
}
//將解答字元串接起來
AnsDNA.push_back(DNAChar[maxChar]);
// calculate Hamming distance
HammingDist = HammingDist + m - table[maxChar];
}//end of i
cout << AnsDNA << endl;
cout << HammingDist << endl;
testcase--;
}
}