uva1368 (DNA Consensus String)

/*
本题题意:
    输入n个长度均为m的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。、
    两个等长字符串的Hamming距离等于字符不同的位置个数,eg: ACGT和GCGA的Hamming距离为2(左数第1, 4个字符不同)。
    输入整数m和n(4≤m≤50, 4≤n≤1000),以及m个长度为n的DNA序列(只包含字母A,C,G,T),
    输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多解,要求为字典序最小的解。
本题思路:
    求出最短的序列和, 将所有的序列排列为一个矩阵, 取每列中出现最多的字符, 取出每列出现最多的字符 构成的序列
    就是最短的Hamming距离, 字符最多, 那么Hamming距离就越小
    具体实现看代码:
*/

 

#include<bits/stdc++.h>
using namespace std;
int c[4][1005];
int main() {
    int cnt, n, M; // M是给定序列的长度 
    map<char, int> m;
    char cha[4] = {'A', 'C', 'G', 'T'};
    m['A'] = 0; m['C'] = 1; m['G'] = 2; m['T'] = 3;
    scanf("%d", &cnt); // 判断的组数 
    while(cnt--) {
        memset(c, 0, sizeof(c));
//        fill(c[0] + 0, c[0] + 4 * 1005, 0);  //需要初始化二维数组 
        scanf("%d%d", &n, &M); // n 行 M为序列的长度 
        getchar();
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < M; j++) {
                char letter;
                scanf("%c", &letter); // 输入字符
                c[m[letter]][j]++;
            }
            getchar();    
        }
        int res = 0; // 记录最终的结果 
        for(int i = 0; i < M; i++) {
            int max = 0, u = 0; // 分别记录第i列序列中最大的字符数量与 cha字符的下标位置 
            for(int j = 0; j < 4; j++) {
                
                if(c[j][i] > max) {
                    max = c[j][i];
                    u = j; //
                }
            }
            res += n - max; // 此处是行的高度 - 最大的字符数量求出ham距离 
            printf("%c", cha[u]);
        }
        printf("\n%d\n", res);
    } 
    return 0;
}

 

posted @ 2019-12-12 12:45  yxdh  阅读(296)  评论(1编辑  收藏  举报