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;
}
不忘初心方得始终