DNA序列(DNA Consensus String)

野性酷女 2023-03-06 05:23 122阅读 0赞

输入m个长度为n的DNA序列,求一个DNA序列,到所有序列的总的Hamming距离尽量小,两个等长字符串的Hamming距离等于字符不同的位置个数,例如,ACGT和GCGA的Hamming距离为2(左数第1,4个字符不同)。
输入整数m和n(4<=m<=50,4<=n<=1000),以及m个长度为m的DNA序列(只包含字母A,C,G,T),输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多解,要求为字典序最小的解。例如,对于下面5个DNA序列,最优解为TAAGCTAC。
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT

  1. #include<stdio.h>
  2. #include<string.h>
  3. int a[55][55]; //防止程序异常退出
  4. int main()
  5. {
  6. int n,m;
  7. char s[55][1005];
  8. memset(a,0,sizeof(a));
  9. scanf("%d%d",&n,&m);
  10. for(int i = 1;i <= n;i++)
  11. {
  12. scanf("%s",s[i]);
  13. }
  14. //计算Hamming值,
  15. for(int i = 1;i <= n;i++)
  16. {
  17. for(int j = 1;j <= n;j++)
  18. {
  19. if(j < i)
  20. {
  21. a[i][j] = a[j][i];
  22. }
  23. else if(j > i)
  24. {
  25. for(int k = 0;s[i][k] != '\0';k++)
  26. {
  27. if(s[i][k] != s[j][k])
  28. {
  29. a[i][j]++;
  30. }
  31. }
  32. }
  33. }
  34. }
  35. //统计Hamming
  36. for(int i = 1;i <= n;i++)
  37. {
  38. for(int j = 1;j <= n;j++)
  39. {
  40. a[i][n+1] += a[i][j];
  41. }
  42. }
  43. //找到Hamming最小值的那个DNA序列
  44. int min = 1;
  45. for(int i = 2;i <= n;i++)
  46. {
  47. if(a[i][n+1] < a[min][n+1])//值小则替换更新
  48. {
  49. min = i;
  50. }
  51. else if(a[i][n+1] == a[min][n+1])//值相等则取字典序较小的
  52. {
  53. if(strcmp(s[i],s[min]) < 0)
  54. {
  55. min = i;
  56. }
  57. }
  58. }
  59. printf("%s\n",s[min]);
  60. return 0;
  61. }

发表评论

表情:
评论列表 (有 0 条评论,122人围观)

还没有评论,来说两句吧...

相关阅读

    相关 重复的DNA序列

    题目描述 DNA序列 由一系列核苷酸组成,缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。 例如,“ACGAATTCCG” 是一个 DNA序列 。 在研究 DNA

    相关 DNA序列

    > 一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工