UVA 1368 DNA Consensus String

Problem

http://write.blog.csdn.net/postlist

Thinking

題意為給定很多個字串, 找出一個字串跟這些字串hamming distance的加總最小, 並印出此hamming distance加總

假如有五個字串如下

    12345678
    TATGATAC
    TAAGCTAC
    AAAGATCC
    TGAGATAC
    TAAGATGT
    --------
    TAAGATAC

為什麼TAAGATAC為解答,仔細看

  • 第一個column, T是最多的
  • 第二個column, A是最多的
  • 第三個column, A是最多的
  • 第三個column, G是最多的
    etc...

所以做法就是遍歷每一個column的時候, 用一個table記錄ACTG個別出現次數, 並找出常出現的

Solution

//uva 1368 DNA Consensus String
#include<iostream>


typedef enum{A=0,C=1,G=2,T=3}e;
char DNAChar[4] = {'A','C','G','T'};
using namespace std;


int main()
{
    int testcase;
    cin >> testcase;
    while(testcase > 0)
    {
        //initialize
        int m,length;
        cin >> m >> length;
        string *DNAs = new string[m];
        
        string AnsDNA;
        int HammingDist = 0;
    
        for(int i = 0 ; i < m ; i++)
            cin >> DNAs[i];

        
        for(int i = 0 ; i < length ; i++)
        {
            //使用table計算ACTG個數
            int table[4] = {0};
            for(int j = 0; j < m ; j++)
            {
                switch (DNAs[j][i]) 
                {
                    case 'A':
                        table[A]++;
                        break;
                    case 'C':
                        table[C]++;
                        break;
                    case 'G':
                        table[G]++;
                        break;
                    case 'T':
                        table[T]++;
                        break;
                        
                    default:
                        break;
                }//end of switch
            }//end of j
            
            
            //find max element and max element index
            /*因為ACTG本身就是字典排列, 所以就算table統計出來都一樣, max一樣是取字典順序最小的, 若ACTG統計結果個數皆一樣, 以下程式則會取A */
            int maxChar = 0;
            for(int j = 0 ; j < 4 ; j++)
            {
                if(table[maxChar] < table[j])
                    maxChar = j;
            }
            
            //將解答字元串接起來
            AnsDNA.push_back(DNAChar[maxChar]);
           
            // calculate Hamming distance
            HammingDist = HammingDist + m - table[maxChar];
        }//end of i
        
        cout << AnsDNA << endl;
        cout << HammingDist << endl;
        
        testcase--;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容