首页 > 代码库 > LA 3602 DNA Consensus String

LA 3602 DNA Consensus String

最近审题老是一错再错,Orz

题目中说求一个Hamming值总和最小的字符串,而不是从所给字符中找一个最小的

这样的话,我们逐列处理,所求字符串当前位置的字符应该是该列中出现次数最多其次ASCII值最小的

代码有点挫了,if语句太多了

 

 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6  7 char gene[52][1010], ans[1010]; 8 int num[4]; 9 10 int main(void)11 {12     #ifdef LOCAL13         freopen("3602in.txt", "r", stdin);14     #endif15 16     int T;17     scanf("%d", &T);18     while(T--)19     {20         int n, m, hamming = 0;21         scanf("%d%d", &n ,&m);22         for(int i = 0; i < n; ++i)23             scanf("%s", gene[i]);24         for(int i = 0; i < m; ++i)25         {26             int Max = 0;27             for(int j = 0; j < 4; ++j)    num[j] = 0;28             for(int j = 0; j < n; ++j)29             {30                 if(gene[j][i] == A)    ++num[0];31                 if(gene[j][i] == C)    ++num[1];32                 if(gene[j][i] == G)    ++num[2];33                 if(gene[j][i] == T)    ++num[3];34             }35             for(int j = 1; j < 4; ++j)36                 if(num[j] > num[Max])37                     Max = j;38             if(Max == 0)    ans[i] = A;39             if(Max == 1)    ans[i] = C;40             if(Max == 2)    ans[i] = G;41             if(Max == 3)    ans[i] = T;42             hamming += num[0] + num[1] + num[2] + num[3] - num[Max];43         }44         ans[m] = \0;45         printf("%s\n%d\n", ans, hamming);46     }47     return 0;48 }
代码君

 

LA 3602 DNA Consensus String