zoukankan      html  css  js  c++  java
  • uva 1368 DNA Consensus String

    这道题挺简单的,刚开始理解错误,以为是从已有的字符串里面求最短的距离,后面才发现是求一个到所有字符串最小距离的字符串,因为这样的字符串可能有多个,所以最后取最小字典序的字符串。

    我的思路就是求每一列每个基因A、C、G、T的数量,找到最大值,最大值可能不止一个,但是锁定字典序最小的那个为所求字符串当前列的值,求解实例如下所示

    TATGATAC
    TAAGCTAC
    AAAGATCC
    TGAGATAC
    TAAGATGT

    对于上述字符串,第一列A,C,G,T的值分别为1,0,0,4,可见最大值为4,说明当前列到每个字符串之和最短的是T字母,所以得到所求字符串第一个字母为T,同样的方法求得剩下所有字符,最后得到所求字符串为TAAGATAC,而 consensus error的值等于每一列的值相加,第一列,最大值为4,那么consensus error在第一列的值为m-4=5-4=1;所以consensus error的值为1+1+1+0+1+0+2+1=7,具体实现代码如下:

    #include<algorithm>  
    #include<cstring>  
    #include<cstdio> 
    #include<iostream>
    #define len  1010  
    #define M 55  
    using namespace std;
    
    char dna[M][len];
    int gene[5];
    int m, n;
    
    
    int main()
    {
        int T;
        int minSum;
        char res[1010];
        cin >> T;
        while (T--) {
            cin >> m >> n;
            minSum = 0;
            for (int i = 0;i < m;i++)
                cin >> dna[i];
            int j = 0;
            for (j = 0;j < n;j++) {
                memset(gene, 0, sizeof(gene));
                for (int i = 0;i < m;i++) {
                    switch (dna[i][j]) {
                    case 'A':gene[0]++;break;
                    case 'C':gene[1]++;break;
                    case 'G':gene[2]++;break;
                    case 'T':gene[3]++;break;
                    default:break;
                    }
                }
                int max = 0;
                for (int i = 0;i < 4;i++) {
                    if (gene[i] > max) {
                        max = gene[i];
                        switch (i) {
                        case 0:res[j] = 'A';break;
                        case 1:res[j] = 'C';break;
                        case 2:res[j] = 'G';break;
                        case 3:res[j] = 'T';break;
                        default:break;
                        }
                    }
                }
                minSum += m-max;
            }
            res[j] = '';
            cout << res << endl;
            cout << minSum << endl;
    
        }
        return 0;
    }
  • 相关阅读:
    jdk .tar.gz 包安装 inAction
    Consistent Hashing原理与实现
    开放GitHub的理由
    dll signing issue
    Regular expression cheat sheet
    DOMElement之Offset
    扫码支付测试点
    SQL注入是什么?如何防止?
    什么是接口测试?为什么要做接口测试?如何开展接口测试?
    软件测试的常识
  • 原文地址:https://www.cnblogs.com/ArvinShaffer/p/6159674.html
Copyright © 2011-2022 走看看