本文主要是介绍LA - 3602 - DNA Consensus String,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题意:有m个长度为n的ACGT序列,求一个长度为n的序列,使得每一位与这m个序列相应位的距离和最小(相同为0,不同为1)(4 <= m <= 50, 4 <= n <= 1000)。
题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=19&problem=1603
——>>统计每一位A、C、G、T出现的次数,取出现最多的。
#include <cstdio>
#include <cstring>using namespace std;const int maxn = 1000 + 10;int main()
{int A[maxn], C[maxn], G[maxn], T[maxn], t, m, n, i, j;char s[maxn];scanf("%d", &t);while(t--){scanf("%d%d", &m, &n);memset(A, 0, sizeof(A));memset(C, 0, sizeof(C));memset(G, 0, sizeof(G));memset(T, 0, sizeof(T));for(j = 0; j < m; j++){scanf("%s", s);for(i = 0; i < n; i++){switch(s[i]){case 'A':{A[i]++;break;}case 'C':{C[i]++;break;}case 'G':{G[i]++;break;}case 'T':{T[i]++;break;}}}}char ret[maxn];int cnt = 0;for(i = 0; i < n; i++){int Max = -1, num;if(A[i] > Max){Max = A[i];ret[i] = 'A';num = A[i];}if(C[i] > Max){Max = C[i];ret[i] = 'C';num = C[i];}if(G[i] > Max){Max = G[i];ret[i] = 'G';num = G[i];}if(T[i] > Max){Max = T[i];ret[i] = 'T';num = T[i];}cnt += m - num;}for(i = 0; i < n; i++) putchar(ret[i]);printf("\n");printf("%d\n", cnt);}return 0;
}
这篇关于LA - 3602 - DNA Consensus String的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!