zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    部署 AppGlobalResources 到 SharePoint 2010
    还原一个已删除的网站集
    使用仪表板设计器配置级联筛选器 (SharePoint Server 2010 SP1)
    File or arguments not valid for site template
    Pex and Moles Documentation
    Content Query Webpart匿名访问
    Running Moles using NUnit Console from Visual Studio
    Calling a WCF Service using jQuery in SharePoint the correct way
    Updating Content Types and Site Columns That Were Deployed as a Feature
    asp.net中判断传过来的字符串不为空的代码
  • 原文地址:https://www.cnblogs.com/sykline/p/9997380.html
Copyright © 2011-2022 走看看