算法竞赛入门经典(第2版) Consensus String UVa 1368

DNA Consensus String UVa 1368

—————————————————————————
题目:UVa 1368
—————————————————————————
思路:对输入的每一列,记录出现次数最多的字符存入ans数组中,设初始Hamming长度l=m*n(假设输入的所有字符都不一样),当获取完每一列出现最多的次数时将l减去次数,最终结果即为最小Hamming距离。

PS:Hamming距离即为等长字符串对应位置的不同字符个数。

Sample Input
3
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA
6 10
ATGTTACCAT
AAGTTACGAT
AACAAAGCAA
AAGTTACCTT
AAGTTACCAA
TACTTACCAA

Sample Output
TAAGATAC
7
ACGTACGTAA
6
AAGTTACCAA
12
#include <bits/stdc++.h>
#define maxn 1005
using namespace std;

int main(){
	int T;
	scanf("%d", &T);
	while(T--) {
		int m, n;
		char ans[maxn] = {0};
		scanf("%d%d", &m, &n);
		int l = m*n;
		char a[m][n];
		getchar();
		for(int i = 0; i < m; i++) {
			for(int j = 0; j < n; j++) {
				scanf("%c", &a[i][j]);
			}
			getchar();
		}
		
		for(int j = 0; j < n; j++) {
			int sum[4] = {0};
			for(int i = 0; i < m; i++) {
				switch(a[i][j]) {
					case 'A':	sum[0]++; break;
					case 'C':	sum[1]++; break;
					case 'G':	sum[2]++; break;
					case 'T':	sum[3]++; break;
				}
			}
			int max = 0;
			char tmp;
			for(int i = 1; i < 4; i++) {
				if(sum[i]>sum[max]) 
					max = i;
			}
			l -= sum[max];
			switch(max) {
				case 0: tmp = 'A'; break;
				case 1: tmp = 'C'; break;
				case 2: tmp = 'G'; break;
				case 3: tmp = 'T'; break;
			}
			ans[j] = tmp;
		}
		for(int i = 0; i < n; i++) {
			printf("%c", ans[i]);
		}
		printf("\n%d\n", l);
	}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值