习题 3-7 DNA序列 (模板题)

输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。两个等长字符串的Hamming距离等于字符不同的位置个数,如ACGT和GCGA和Hamming距离为2(左数第一1,4个字符不同)。

输入整数m和n(4<=m<=50,4<=n<=1000),以及m个长度为n的DNA序列(只包含字母A,C,G,T),输入到m个序列的Hamming距离和最小的DNA序列和对应的距离。如果有多解,要求字典序最小的解。例如,对于下面5个DNA序列,最优解为TAAGATAC。

TATGATAC

TAAGCTAC

AAAGATCC

TGAGATAC

TAAGATGT

#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main(){
    int m,n;
    cin>>m>>n;
    vector<map<char,int>>arr(n);
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            char k;
            cin>>k;
            arr[j][k]++;
        }
    }
    int sum=0;
    for(int i=0;i<n;i++){
        vector<pair<char,int>>brr(arr[i].begin(),arr[i].end());
        sort(brr.begin(),brr.end(),[&](pair<char,int>a,pair<char,int>b)->bool{
                                                if(a.second==b.second)return a.first<b.first;
                                                else return a.second>b.second;});
        sum+=m-brr.begin()->second;
        cout<<brr.begin()->first;
    }
    cout<<endl;
    cout<<sum;
}

 分析:

对于所求结果序列S来说,Hamming距离和最小意味着S中每一列的字符都在m个序列的对应列上出现次数最多。可以依次对m个序列中每一列的字符进行统计,字典序最小并且出现次数最多的那个就是S中这一列的字符。

收获:

1.将一个存储完毕的map(m)放到vector中:vector<pair<T,T>>brr(m.begin().m.end())。此操作通常搭配sort对map中的元素按键或者值进行排序。

2.cpp并非所有容器都可以使用sort进行排序如本题的map就不能,因为map是非线性的,这样的容器有:set,unordered_set,multiset,map,unordered_map。

3.可以将存储完毕的map中的每一个元素看作一个pair<T,T>:

如遍历一个map(m):for(auto x:m) x代表map中的某一个元素也就是某一对键值对,然后通过x.first和x.second可以分别使用每个元素中的键和值。

又如一个map(m)的第一个元素的键值可以表示为m.begin()->first;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值