DNA序列(uva-1368)

输入m个长度为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。两个等长字符串的Hamming距离等于字符不同的位置个数,例如,ACGT和GCGA的Hamming距离为2。

输入整数m和n,以及m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多解,要求为字典序最小的解。例如,对于下面5个DNA序列,最优解为TAAGATAC。

TATGATAC 
TAAGCTAC 
AAAGATCC 
TGAGATAC 
TAAGATGT 
解决本题时,我们首先会想到要求所有的序列的距离和最小,就是要求同一纵行数量最多的那个字母、所以我们考虑重新定义一个新的字符数组,来存储这些字母即是最优解。

代码如下:

#include
#include
using namespace std;
const int maxn=10e4+10;
char map[60][maxn];  //DNA序列阵
int main()
{
    int cases;  //测试实例
    scanf("%d",&cases);
    while(cases--)
    {
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=0;i=itb&&ita>=itc&&ita>=itd)  //如果A最多,则A作为最优解的第一个字符。ans记录对应的距离,也就是非A字母的个数
        {   str[i]='A';ans+=n-ita;}
        else if(itb>=ita&&itb>=itc&&itb>=itd)  //如果C最多,则C作为最优解的第一个字符。ans记录对应的距离,也就是非C字母的个数
        {   str[i]='C';ans+=n-itb;}
        else if(itc>=ita&&itc>=itb&&itc>=itd)   //如果G最多,则G作为最优解的第一个字符。ans记录对应的距离,也就是非G字母的个数
        {   str[i]='G';ans+=n-itc;}
        else
        {   str[i]='T';ans+=n-itd;}   //如果T最多,则T作为最优解的第一个字符。ans记录对应的距离,也就是非T字母的个数
    }                                   //这样通过一组if语句的判断既找出了最优解的字符组成,而且计算了对应的距离,最重要的是这样的结果已经满足了多解时的字典序最小解
    str[m]='\0';
    printf("%s\n%d\n",str,ans);
    }
    return 0;
}


你可能感兴趣的:(暑期训练)