uva 1368 DNA Consensus String

点击打开链接uva 1368

思路:暴力
分析:
1 给定m个长度均为n的DNA序列,求一个DNA使其所有的序列的
Hamming distances最小,如果有多个解输出字典序最小的序列
2 m最大为50,n最大为1000,很明显的暴力题目,没什么解题的方法就是暴力

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;

const int N = 100;
const int maxn = 1010;
const char ch[4] = {'A' , 'C' , 'G' , 'T'};
char str[N][maxn];

//得到下标
int getIndex(char c){
    for(int i = 0 ; i < 4 ; i++)
       if(c == ch[i])
          return i;
}

//得到最大的值的下标
int getMax(int *num){
    int pos = 0;
    for(int i = 1 ; i < 4 ; i++)
       if(num[i] > num[pos])
         pos = i;
    return pos;
}

void solve(int m , int n){
    int num[4];
    int ans = 0;
    char ansStr[maxn];
    memset(ansStr , '\0' , sizeof(ansStr));
    for(int i = 0 ; i < n ; i++){
       memset(num , 0 , sizeof(num));
       for(int j = 0 ; j < m ; j++)
          num[getIndex(str[j][i])]++;
       int maxIndex = getMax(num);
       ansStr[i] = ch[maxIndex];
       ans += m-(num[maxIndex]);
    }
    printf("%s\n%d\n" , ansStr , ans);
}

int main(){
    int Case , m , n;
    scanf("%d" , &Case);
    while(Case--){
        scanf("%d%d" , &m , &n);
        for(int i = 0 ; i < m ; i++)
           scanf("%s" , str[i]);
        solve(m , n);
    }
    return 0;
}



你可能感兴趣的:(String)