UVA - 1368 DNA Consensus String

来源:互联网 发布:淘宝直通车养词要多久? 编辑:程序博客网 时间:2024/05/20 05:25

题目大意:输入 m 个长度均为 n 的 DNA 序列,求一个 Hamming 距离最小的序列,即最相似的序列,多解要求字典序最小。并输出距离。Hamming 距离等于字符不同的位置个数。

解题思路:统计所有 DNA 序列中每个位置出现各个字符的次数,记录出现最多的字符与次数,将这些字符连接起来就是所求序列,每个位置的 Hamming 距离为 DNA 序列个数减去最大次数,各位置相加即可。
卡了比较久,因为把样例复制到文件的时候忘记删除每行末尾的空格,导致多了一个 getchar(); 但提交后并不需要所以一直WA,坑,下次注意。

#include<iostream>#include<cstdio>#include<string.h>using namespace std;char DNA[55][1005]; int num[5][1005];int max_[1005];int str[1005];int main() {    int T;    scanf("%d", &T);    while (T--) {        memset (DNA, '0', sizeof(DNA));        memset (num, 0, sizeof(num));        memset (max_, 0, sizeof(max_));        memset (str, 0, sizeof(str));               int m, n;        scanf("%d%d", &m, &n);        getchar();        for (int i = 0; i < m; i++)            gets(DNA[i]);        for (int i = 0; i < m; i++)            for (int j = 0; j < n; j++) {                if (DNA[i][j] == 'A') num[0][j]++;                if (DNA[i][j] == 'C') num[1][j]++;                if (DNA[i][j] == 'G') num[2][j]++;                if (DNA[i][j] == 'T') num[3][j]++;            }                   for (int i = 0; i < n; i++)            for (int j = 0; j < 4; j++)                if (num[j][i] > max_[i]) {                    max_[i] = num[j][i];                    str[i] = j;                }        int sum = 0;        for (int i = 0; i < n; i++){            sum += m - max_[i];            if (str[i] == 0) printf("A");            if (str[i] == 1) printf("C");            if (str[i] == 2) printf("G");            if (str[i] == 3) printf("T");        }        printf("\n%d\n", sum);     } return 0;}
0 0
原创粉丝点击