Chinaunix首页 | 论坛 | 博客
  • 博客访问: 77020
  • 博文数量: 32
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 284
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-26 14:00
个人简介

有梦想的人,正在努力

文章分类

全部博文(32)

文章存档

2015年(32)

我的朋友

分类: C/C++

2015-06-04 18:50:19

    输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离之和最小。
两个等长的DNA序列的Hamming距离等于字符不同的位置个数,例如,ACGT和GCGA的Hamming距离为2(第1个和第4个)。
    输入整数m和n(4≤m≤50,4≤m≤1000),以及m个长度为n的DNA序列(只包含字母A,G,C,T),
输出到m个序列的Hamming距离最小和的DNA序列和对应的距离,如果有多解,输出字典序最小的那个。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <string.h>
  3. const char X[] = {'A', 'C', 'G', 'T'};
  4. int main()
  5. {
  6.     int m, n, t, i, j, d, ct[4];
  7.     char dna[50][1005];
  8.     char ans[1005];
  9.     scanf("%d", &t);
  10.     while(t--)
  11.     {
  12.         d = 0;
  13.         scanf("%d%d", &m, &n);
  14.         i = 0;
  15.         while(i < m)
  16.             scanf("%s", dna[i++]);
  17.         //统计每列各种字符数
  18.         for(j = 0; j < n; ++j)
  19.         {
  20.             memset(ct, 0, sizeof(ct));
  21.             for(i = 0; i < m; ++i)
  22.             {
  23.                 if('A' == dna[i][j]) ++ct[0];
  24.                 else if('C' == dna[i][j]) ++ct[1];
  25.                 else if('G' == dna[i][j]) ++ct[2];
  26.                 else ++ct[3];
  27.             }
  28.             //找出每列出现最多的字符
  29.             int max = -1;
  30.             char ch = 255;
  31.             for(i = 0; i < 4; ++i)
  32.             {
  33.                 if(ct[i] > max)
  34.                 {
  35.                     max = ct[i];
  36.                     ch = X[i];
  37.                 }
  38.                 else if(ct[i] == max)
  39.                     if(X[i] < ch)
  40.                         ch = X[i];
  41.             }
  42.             //计算距离
  43.             for(i = 0; i < m; ++i)
  44.                 if(dna[i][j] != ch) ++d;
  45.             ans[j] = ch;
  46.         }
  47.         ans[n] = '\0';
  48.         printf("%s\n%d\n", ans, d);
  49.     }
  50.     return 0;
  51. }

阅读(1037) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~