UVA 1368 DNA Consensus String

本文介绍了一种算法,用于从一组等长字符串中找出一个字母序最小的字符串y,使得y与所有输入字符串的Hamming距离之和最小。通过统计每个位置上出现最多的字符并输出,最终得到目标字符串。

给出一组等长的字符串S

求出字母序最小的字符串y,满足y和S的Hamming距离最小.

两个字符串的Hamming距离等于相同位置上不同字符的位置个数.

y和S的Hamming距离等于y和所有的Si的Hamming距离和.

对于每个位置j,求字符次数最多的S[i.j]输出就可以了.

#include <iostream>
#include <cstdio>
using namespace std;
const int maxn = 55;
int n, m;
char str[maxn][1010];
int main(){
	int T;
	scanf("%d", &T);
	while (T--){
		scanf("%d%d", &n, &m);
		for (int i = 0; i < n; ++i){
			scanf("%s", str[i]);
		}
		int ansV = 0;
		for (int j = 0; j < m; ++j){
			int conv[26] = {0};
			int maxv = 0;
			char ansC = 'A';
			for (int i = 0; i < n; ++i){
				int ch = str[i][j] - 'A';
				conv[ch]++;
				if(conv[ch] > maxv){
					ansC = ch + 'A';
					maxv = conv[ch];
				}else if(conv[ch] == maxv && ch + 'A' < ansC){
					ansC = ch + 'A';
				}
			}
			printf("%c", ansC);
			for (int i = 0; i < n; ++i){
				ansV += str[i][j] != ansC;
			}
		}
		printf("\n%d\n", ansV);
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值