UVa 1368 - DNA Consensus String(AC)

题目大意:输入m个长度均为n的DNA序列,求一个DNA序列到所以DNA序列的距离之和最小(存在多个则输出字典序最小的那个)。

DNA序列之间的距离:两条链字符不同的位置个数。

题目链接:1368 - DNA Consensus String

最开始以为要求的DNA序列是输入序列的其中一条,结果发现输出样例都不一样。。。

既然求的是最小的就简单的,记录每个位置的各个字符的个数,所求列这个位置的字符自然就是数量最多的那个字符了。

#include 
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
	int T, m, n,MAX,dis;
	char ch;
	cin >> T;
	while (T--)
	{
		cin >> m >> n;
		dis = 0;
		int num[1001][4] = { 0 }; // A C  G  T
		for (int j = 0; j < m; j++)
			for (int i = 0; i < n; i++)
			{
				cin >> ch;
				if (ch != 'A' && ch != 'C' && ch != 'G' && ch != 'T') i--;
				if (ch == 'A') num[i][0]++;
				if (ch == 'C') num[i][1]++;
				if (ch == 'G') num[i][2]++;
				if (ch == 'T') num[i][3]++;
			}
		for (int i = 0; i < n; i++)
		{
			ch = 'A',MAX=num[i][0];
			if (num[i][1]>MAX) ch = 'C', MAX = num[i][1];
			if (num[i][2]>MAX) ch = 'G', MAX = num[i][2];
			if (num[i][3]>MAX) ch = 'T', MAX = num[i][3];
			cout << ch;
			dis += num[i][0] + num[i][1] + num[i][2] + num[i][3] - MAX;
		}
		cout << endl << dis << endl;
	}
	//system("pause");
	return 0;
}


你可能感兴趣的:(UVa,problem)