uva1368题解 zyq

xiaoxiao2025-03-13  9

题意: 输入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

解析:要求Hamming距离距离最小,只要输出每一列字母中出现次数最多的字母,就是题目要求的最优解。

#include<stdio.h> #include<string.h> int main() { char s[55][1005]; int T,m,n; scanf("%d",&T); while(T--) { int sum=0,sum1; scanf("%d%d",&m,&n); for(int i=0;i<m;i++) scanf("%s",s[i]); int num[5]; //记录每一列中4个字母出现的次数 int max,maxd; //记录最多的次数,以及对应的下标 for(int j=0;j<n;j++) //j为列 { memset(num,0,sizeof(num)); for(int i=0;i<m;i++) //i为行 { if(s[i][j]=='A') num[0]++; if(s[i][j]=='C') num[1]++; if(s[i][j]=='G') num[2]++; if(s[i][j]=='T') num[3]++; } max=num[0]; maxd=0; for(int k=1;k<4;k++) { if(max<num[k]) { max=num[k]; maxd=k; } } sum1=0; for(int k=0;k<4;k++) { if(k==maxd) continue; else sum1+=num[k]; } sum+=sum1; if(maxd==0) putchar('A'); if(maxd==1) putchar('C'); if(maxd==2) putchar('G'); if(maxd==3) putchar('T'); } printf("\n%d\n",sum); } return 0; }
转载请注明原文地址: https://www.6miu.com/read-5025767.html

最新回复(0)