UVa1368 - DNA Consensus String 题解

题目

题目链接

UVa1368 - DNA Consensus String

题目大意

给几串DNA串,要求找出共同的串,以及某个数字H。例如:
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
这5个DNA串的共同串为:TAAGATAC。该数字H为,第一列T以外的字符之和+第二列A以外的字符之和+...+第8列C以外字符之和即H=1+1+1+0+1+0+2+1=7。
注意,如果存在多个共同串,则选择字典序最小的那个。

输入为T组数据。接下来每组数据的第一行为2个数字m(DNA串数,4<=m<=50),n(每个DNA串的字符数,4<=n<=1000)。

每组数据输出为2行,第一行为DNA共同串,第二行为数字H。

样例输入

3
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA
6 10
ATGTTACCAT
AAGTTACGAT
AACAAAGCAA
AAGTTACCTT
AAGTTACCAA
TACTTACCAA

样例输出

TAAGATAC
7
ACGTACGTAA
6
AAGTTACCAA
12

题解

其实题目经过我的翻译,思路已经很清晰了- -因为我不会翻译,只能这么搞。。

主体程序为先整出共同串,然后计算数字H。

Then show the code.

#include <stdio.h>
#include <string.h>

char dnas[55][1005];
char results[1005];
int temp[4];

int main(){
    int T;
    scanf("%d", &T);
    while(T--){
        int n, m, H, maxnum[2];
        const char DNA[] = "ACGT";
        H = 0;
        //读取DNA串
        memset(dnas, 0, sizeof(dnas));
        memset(results, 0, sizeof(results));
        scanf("%d%d", &m, &n);
        for(int i=0; i<m; i++)
            scanf("%s", dnas[i]);

        //注意这里的i表示的是字符串的列
        for(int i=0; i<n; i++){
            memset(temp, 0, sizeof(temp));
            memset(maxnum, 0, sizeof(maxnum));
            //计算第i列,每个字符的数目
            for(int j=0; j<m; j++){
                switch(dnas[j][i]){
                    case 'A': temp[0]++; break;
                    case 'C': temp[1]++; break;
                    case 'G': temp[2]++; break;
                    case 'T': temp[3]++; break;
                }
            }
            //找出共同次数最多的字符
            for(int j=0; j<4; j++){
                if(temp[j] > maxnum[0]){
                    maxnum[0] = temp[j];
                    maxnum[1] = j;
                }
            }
            results[i] = DNA[maxnum[1]];
            H = H + m - maxnum[0];
        } 
        printf("%s\n%d\n", results, H);
    }
    return 0;
}
posted @ 2020-11-06 20:43  1v7w  阅读(107)  评论(0编辑  收藏  举报