DNA序列(算法竞赛入门经典第二版3-7)

输入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;

}

以上~

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值