DNA序列(DNA Consensus String)

题目

输入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序列,最优解为TAAGATACC。

TATGATAC

TAAGCTAC

AAAGATCC

TGAGATAC

TAAGATGT

 

分析

求一个DNA序列到所有序列的Hamming距离尽量小。

所以找出每列出现频率最多的,如果频率相同,用字典序较小的。

 

c实现

复制代码
#include<stdio.h>
#include<string.h>

const char a[]="ACGT";
int main()
{
    int m,n;
    scanf("%d%d",&m,&n);
    //用来存储输入的DNA序列和答案 
    char s[m+1][n];
    //用来标记每列中ACGT出现的次数 
    int count[4];
    //输入DNA序列 
    for(int i=0;i<m;i++)
    {
        scanf("%s",s[i]);
    }
    //存储距离 
    int sum=0; 
    //按列遍历 
    for(int j=0;j<n;j++){
        //对每个列都需要重置count数组为0 
        memset(count,0,sizeof(count));
        //统计每列中的ACGT的个数 
        for(int i=0;i<m;i++){
            int k=0;
            for(;k<4;k++)
            {
                if(s[i][j]==a[k]) 
                {
                    break;
                }
            }
            count[k]++;
        }
        //找出每列中ACGT出现最多的 
        int max=0;
        for(int l=0;l<4;l++){
            if(count[max]<count[l]){
                max=l;
            }
            sum += count[l];
        }
        //把出现频率最多的存入答案 
        s[m+1][j]=a[max];
        sum -= count[max];
    }
    //打印出答案 
    for(int j=0;j<n;j++){
        printf("%c ",s[m+1][j]);
    }
    printf("\n");
    printf("%d",sum);
    printf("\n");
    return 0;
}
复制代码
posted @   Vincent-yuan  阅读(1244)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示