1368:DNA Consensus String

问题简述:给定m个长度为n的DNA序列,求一个DNA序列,使其到所有这些序列的总hamming距离尽量小,如果有多个解,输出字典顺序的最小解。

贪心

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 1000 + 5,maxm = 50 + 5;
char table[maxn][maxn];
char A[] = {'A','C','G','T'};
int main(){
    int m,n,T;
    scanf("%d",&T);
    while(T--){
        memset(table,'\0',sizeof(table));
        scanf("%d %d",&m,&n);
        for(int i = 0;i < m;i++){
            scanf("%s",table[i]);
        }
        int dis = 0;
        char s[n];
        for(int i = 0;i < n;i++){
            int num[26] = {0};
            for(int j = 0;j < m;j++){
                num[table[j][i] - 'A']++;
            }
            int maxcnt = 0;
            char choose;
            for(int i = 0;i < 4;i++){
                if(num[A[i] - 'A'] > maxcnt){
                    maxcnt = num[A[i] - 'A'];
                    choose = A[i];
                }
            }
            dis += m - maxcnt;
            s[i] = choose;
        }
        for(int i = 0;i < n;i++) putchar(s[i]);
        printf("\n%d\n",dis);
    }

    return 0;
}

posted @ 2018-04-05 18:15  ACLJW  阅读(166)  评论(0编辑  收藏  举报