此题就是找每一列中出现次数最多的字母,出现次数最多那么在最优解中的对应位置的字符就是这个出现次数最多的字符。
#include <stdio.h>
#include <string.h>
#include <string>
#include <iostream>
using namespace std;
#define maxm 55
#define maxn 1005
char buf[maxm][maxn];
char result[maxn];
char re(int x)
{
if(x==1)
return 'A';
if(x==2)
return 'C';
if(x==3)
return 'G';
if(x==4)
return 'T';
}
int main()
{
int num;
scanf("%d",&num);
int count[5]; //用于计数1=A ;2=C;3=G;4=T
while(num--)
{
memset(buf,0,sizeof(buf));
memset(result,0,sizeof(result));
int m,n;
int size=0;
scanf("%d%d",&m,&n);
for(int i=0;i<m;++i)
{
scanf("%s",buf[i]);
}
for(int j=0;j<n;++j){
count[0]=count[1]=count[2]=count[3]=count[4]=0;
int max_count=0;
for(int i=0;i<m;++i){
if(buf[i][j]=='A')
count[1]++;
if(buf[i][j]=='C')
count[2]++;
if(buf[i][j]=='G')
count[3]++;
if(buf[i][j]=='T')
count[4]++;
}
for(int k=1;k<5;++k){
if(count[k]>max_count)
{
max_count=count[k];
result[size]=re(k);
}
}
size++;
}
int hamming=0;
printf("%s\n",result);
for(int i=0;i<m;++i){
for(int j=0;j<n;++j){
if(buf[i][j] != result[j])
hamming++;
}
}
printf("%d\n",hamming);
}
return 0;
}