• UVA-1368 DNA Consensus String(思路)


    题目:

    链接

    题意:

    题目虽然比较长,但读完之后题目的思路还是比较容易想出来的。

    给出m个长度为n的字符串(只包含‘A’、‘T’、‘G’、‘C’),我们的任务是得出一个字符串,要求这个字符串与给出的m个字符串的汉明距离的和最小,输出这个字符串和最小的汉明距离和。

    如果有多个符合题意的字符串,就输出字典序最小的那个字符串。

    思路:

    1、首先给出汉明距离的定义:

    汉明距离表示相同长度的字对应位不同的数量。

    例如:

    10100和11000的汉明距离就是2.

    2、对m个字符串的每一位分别统计‘A’、‘T’、‘G’、‘C’的个数,则答案字符串这一位的字符就是m个字符串中这一位上个数最多的那个字符。这样保证答案字符串的这一位的字符和给出的所有字符串有最大的字符相同数,所以得出的汉明距离就会最小。

    3、得到答案字符串之后,与每一个给出的字符串进行比较得到汉明距离的和。

    代码:

    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define FRE() freopen("in.txt","r",stdin)
    using namespace std;
    typedef long long ll;
    const int maxn = 5e3+10;
    int mp[1010][4];
    char str[55][1005];
    
    int toTransform(char ch){
        int res;
        switch(ch){
        case 'A':
            res = 0;
            break;
        case 'C':
            res = 1;
            break;
        case 'G':
            res = 2;
            break;
        case 'T':
            res = 3;
            break;
        }
        return res;
    }
    
    char toChar(int x){
        char ch;
        switch(x){
        case 0:
            ch = 'A';
            break;
        case 1:
            ch = 'C';
            break;
        case 2:
            ch = 'G';
            break;
        case 3:
            ch = 'T';
            break;
        }
        return ch;
    }
    
    int toJudgeMaxPos(int r){
        int idx = 0,mmax = -inf;
        for(int i = 0; i<4; i++){
            if(mmax < mp[r][i]){
                mmax = mp[r][i];
                idx = i;
            }
        }
        return idx;
    }
    
    int toCountRes(char* sstr,int m,int n){
        int res = 0;
        for(int i = 0; i<n; i++){
            for(int j = 0; j<m; j++){
                if(sstr[i] != str[j][i])
                    res++;
            }
        }
        return res;
    }
    
    int main(){
        int T,m,n;
        scanf("%d",&T);
        while(T--){
            scanf("%d%d",&m,&n);
            for(int i = 0; i<m; i++){
                scanf("%s",str[i]);
            }
    
            memset(mp,0,sizeof(mp));
            for(int i = 0; i<n; i++){//统计m个字符串相同位上A、T、G、C的个数
                for(int j = 0; j<m; j++){
                    int idx = toTransform(str[j][i]);
                    mp[i][idx]++;
                }
            }
    //        for(int i = 0; i<m; i++){
    //            printf("%d  %d  %d  %d
    ",mp[i][0],mp[i][1],mp[i][2],mp[i][3]);
    //        }
            char ans[1001];
            for(int i = 0; i<n; i++){//找出该位上相同个数最多的那个字符,并赋值给ans字符串
                int pos = toJudgeMaxPos(i);
                char temp = toChar(pos);
                ans[i] = temp;
            }
            ans[n] = '';
    //        cout<<ans<<endl;
    
            int res = toCountRes(ans,m,n);//获取汉明距离
            printf("%s
    %d
    ",ans,res);
        }
        return 0;
    }
    /*
    PutIn:
    3
    5 8
    TATGATAC
    TAAGCTAC
    AAAGATCC
    TGAGATAC
    TAAGATGT
    4 10
    ACGTACGTAC
    CCGTACGTAG
    GCGTACGTAT
    TCGTACGTAA
    6 10
    ATGTTACCAT
    AAGTTACGAT
    AACAAAGCAA
    AAGTTACCTT
    AAGTTACCAA
    TACTTACCAA
    PutOut:
    TAAGATAC
    7
    ACGTACGTAA
    6
    AAGTTACCAA
    12
    */
    View Code
  • 相关阅读:
    Pyhton入门 笔记 第二天 变量与运算符
    Pyhton入门 笔记 第一天 数据类型
    HTML 中的特殊字符
    Extjs--12种布局方式
    .NET easyUI tree树状结构
    SqlServer中嵌套事务使用--事务计数指示 BEGIN 和 COMMIT 语句的数目不匹配 --根本问题
    事务回滚 DEMO
    SQL 事物回滚
    一步一步教你玩转.NET Framework的配置文件app.config
    C# tostring() 方法
  • 原文地址:https://www.cnblogs.com/sykline/p/9997380.html
Copyright © 2020-2023  润新知