UVA 1368 DNA Consensus String

10 篇文章 0 订阅
4 篇文章 0 订阅

Problem

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

Thinking

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

假如有五個字串如下

    12345678
    TATGATAC
    TAAGCTAC
    AAAGATCC
    TGAGATAC
    TAAGATGT
    --------
sol 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--;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值