习题 3-7 DNA序列(DNA Consesus String) UVa 1368

探讨了如何通过计算DNA序列间的汉明距离找到与所有序列总距离最小且字典序最小的序列。使用C语言实现,通过统计每列中各碱基的数量选择出现次数最多的碱基构成目标序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:
            给m个长度为n的DNA序列,求一个DNA序列到所有序列的总汉明距离最小,汉明距离为不同字符的位置的个数。如果有多个满足题意得序列则取字典序最小的那个。


Input


2
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA


Output

TAAGATAC
7
ACGTACGTAA
6

实现:

#include<stdio.h>
#include<string.h>
#define maxn 1005
int main()
	{
		int t;
		int m, n;
		char buf[maxn][maxn];
		int cnt;
		char a[maxn];
		int max[4];
		int T, A, G, C;
		int maxmum, index;
		int k;
//		freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin); 
//		freopen("C:\\Users\\zhangwei\\Desktop\\output.txt","w",stdout); 
		scanf("%d",&t);
		while(t--){
			cnt = 0;
			scanf("%d%d",&m,&n);
			for(int i = 0; i < m; i++ ){
				scanf("%s",buf[i]);
			}
			for(int j = 0; j < n; j++ ){
				memset(max, 0, sizeof(max));
				for(int i = 0; i < m; i++ ){
					if(buf[i][j] == 'A')
						max[0]++;
					if(buf[i][j] == 'C')
						max[1]++;
					if(buf[i][j] == 'G')
						max[2]++;
					if(buf[i][j] == 'T')
						max[3]++;
					maxmum = max[0];
					index = 0;
					for(k = 1; k < 4; k++){
						if(max[k] > maxmum){
							index = k;
							maxmum = max[k];
						}
					} 
				}	
				cnt += m-maxmum;//这里 可以直接算出 Hamming数量了 
				char c;
				if(index == 0) c = 'A';
				if(index == 1) c = 'C';
				if(index == 2) c = 'G';
				if(index == 3) c = 'T';
				a[j] = c;
			}
			a[n] = '\0';// 可以自己设定 '\0'  (也可以按照字符数组来输出) 如果按照 %s 末尾必须 加\0
			printf("%s\n%d\n",a, cnt);	
// 这是开始相当计算 Hamming值的方法 需要扫描 效率比较低 
//			for(int i = 0; i < m; i++ ){
//				for(int j = 0; j < n; j++ ){
//					if(buf[i][j] != a[j])
//						cnt++;
//				}
//			}
//			printf("%d\n",cnt);
			
		} 

		return 0;	
	} 


题目 要求 Hamming最小 (并且按照字典序) 利用 数组 int a[] 分别按顺序记录 A C G T 数量 求出的自然是字典序

关于字符数组与字符串:
首先由字符数组的特点:不以字符'\0'为结束标志
         由字符串数组特点:以字符'\0'为结束标志

其次,用printf函数以参数"%s"输出字符串时过程为:
  • 从首地址开始逐字节寻址,把存储单元(一个字节)内的数据转换为相应数据应具有的的形式(如把二进制数转换为字符‘a’)
  • 直到某一个字节内存的元素为字符'\0'时,输出此字符并且寻址结束。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值