输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量
小。两个等长字符串的Hamming距离等于字符不同的位置个数,例如,ACGT和GCGA的
Hamming距离为2(左数第1, 4个字符不同)。
输入整数m和n(4≤m≤50, 4≤n≤1000),以及m个长度为n的DNA序列(只包含字母
A,C,G,T),输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多
解,要求为字典序最小的解。例如,对于下面5个DNA序列,最优解为TAAGATAC。
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
最优解为:
TAAGATAC
最小Hamming距离和 = 7
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA
最优解为:
ACGTACGTAA
最小Hamming距离和 = 6
6 10
ATGTTACCAT
AAGTTACGAT
AACAAAGCAA
AAGTTACCTT
AAGTTACCAA
TACTTACCAA
最优解为:
AAGTTACCAA
最小Hamming距离和 = 12
以上是三组测试数据
代码如下(没有看原题,可能输入输出要求不同)
#include<stdio.h>
#include<string.h>
char dna[55][1005];
char result[1005];
int cnt_agct[200];
char opt_alpha();
int main()
{
int m,n, distance = 0;
scanf("%d%d", &m, &n);
getchar(); //吃掉回车
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
scanf("%c", &dna[i][j]);
getchar(); //吃掉回车
}
for(int j=0;j<n;j++)
{
memset(cnt_agct, 0, sizeof(cnt_agct));
for(int i=0;i<m;i++)
cnt_agct[dna[i][j]]++;
char res_ch = opt_alpha();
for(int i=0;i<m;i++)
if(res_ch != dna[i][j])
distance++;
result[j] = res_ch;
}
printf("\n最优解为:\n");
for(int j=0;j<n;j++)
printf("%c", result[j]);
printf("\n最小Hamming距离和 = %d", distance);
return 0;
}
char opt_alpha()
{
char result_char = 'A';
int no;
(cnt_agct['C'] > cnt_agct['A']) ? (result_char = 'C') : (no = 1);
(cnt_agct['G'] > cnt_agct[result_char]) ? (result_char = 'G') : (no = 1);
(cnt_agct['T'] > cnt_agct[result_char]) ? (result_char = 'T') : (no = 1);
return result_char;
}
以上~