【题目】

输入m组n长的DNA序列,要求找出和其他Hamming距离最小的那个序列,求其与其他的Hamming距离总和。

如果有多个序列,求字典序最小的。

【注】这道题是我理解错误,不是找出输入的序列中和其他距离最小的,而是找到一个DNA序列到所有其他的序列距离最小。

正确方法是统计每一位的AGCT出现频次,然后找到每一位出现最多的。

因为只有AGCT,所以可以用一个dict char dict = "AGCT"这样的套路存储。

【知识点】

  1. 字典序比较:strcmp
#include <string.h>
strcmp(str1, str2)

结果:

0 str1 = str2

负数 str1 < str2

正数 str1 > str2

判断是否满足str1 > str2 的条件:

if(strcmp(str1, str2))

【代码】

#include <iostream>
#include <string.h>
#include <stdlib.h>
using namespace std;
const int max_m = 55;
const int max_n = 1005; void show_matrix(char a[][max_n], int m, int n)
{
for (int i = 0; i < m; i++)
{
printf("%s\n", a[i]);
}
} void show_matrix_digit(int a[][max_n], int m, int n)
{
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
printf("%d",a[i][j]);
}
printf("\n");
}
} int compare_hamming_distance(char a[][max_n], int x, int y, int n)
{
int tot = 0;
for (int i = 0; i < n; i++)
{
if (a[x][i]!=a[y][i])
{
tot++;
}
}
return tot;
} int count_sum_line(int a[][max_n], int m, int x) //一共m组,计算第x行
{
int sum = 0;
for (int i = 0; i < m; i++)
{
sum = sum + a[x][i];
}
return sum;
} int get_min(int a[], int m) //找出数组中的最小值
{
int min = 0x3F3F3F3F;
for (int i = 0; i < m; i++)
{
if (a[i] <= min)
{
min = a[i];
}
}
return min;
} void get_loc(int a[], int m, int min, int b[]) //用一个全0数组b作为标记,如果某位为最小值,将这位置为1. m:数组长度
{
for (int i = 0; i < m; i++)
{
if (a[i] == min)
{
b[i] = 1;
}
}
} int main()
{
char a[max_m][max_n]; //创建二维数组a用于存储
int distance[max_m][max_n]; //建立距离矩阵,用于存储m组数据之间的Hamming距离
int m, n;
//输入二维的长,宽
scanf("%d%d", &m, &n);
fflush(stdin);
//输入m组n长的序列
for (int i = 0; i < m; i++)
{
scanf("%s", a[i]);
fflush(stdin);
}
printf("This is your input:\n");
show_matrix(a, m, n); //函数测试
//int re = compare_hamming_distance(a, 0, 1, n);
//printf("result %d\n", re); //将Hamming距离写入Hamming Distance矩阵
for (int i = 0; i < m; i++)
{
for (int j = i ; j < m; j++)
{
distance[i][j] = compare_hamming_distance(a, i, j, n);
distance[j][i] = compare_hamming_distance(a, i, j, n);
}
}
show_matrix_digit(distance, m, m); //建立一个b数组,存储m组数据分别和其他组数据的距离
int b[max_m];
memset(b, 0, sizeof(b));
for (int i = 0; i < m; i++)
{
b[i] = count_sum_line(distance, m, i);
}
int min = get_min(b, m); //找到最小值
//找到有多少个最小值 //找到对应的数组,标1
int c[max_m];
memset(c, 0, sizeof(c));
get_loc(b, m, min, c); //生成字典序最大值
char d[max_n];
for (int i = 0; i < n; i++)
{
d[i] = 'Z';
} for (int i = 0; i < m; i++)
{
if(c[i])
{
if(strcmp(d,a[i])) //字典序比较
{
for (int j = 0; j < n; j++)
{
d[j] = a[i][j];
}
}
}
} printf("minimum hamming distance to other,the total distance is %d\n", min);
printf("%s",d);
}

【C/C++】习题3-7 DNA/算法竞赛入门经典/数组与字符串的更多相关文章

  1. 【C/C++】习题3-4 周期串/算法竞赛入门经典/数组和字符串

    [题目] 如果某个字符串可以由长度为k的字符串重复多次得到,则称该串以k为周期. 输入一个长度不超过80的字符串,输出最小周期. [思路] 暴力求解.依次考察周期1~长度n. 筛选:周期一定是长度n的 ...

  2. 【C/C++】习题3-3 数数字/算法竞赛入门经典/数组和字符串

    [题目] 把前n个(n<=10000)的整数顺序写在一起:123456789101112-- 数一数0~9各出现多少次(输出10个整数,分别是0,1,2,--,9出现的次数) [解答] 暴力求解 ...

  3. 【C/C++】习题3-5 谜题/算法竞赛入门经典/数组和字符串

    [题目] 有一个5*5的网络,恰好有一个格子是空的(空格),其他格子各有一个字母. 指令:A, B, L, R 把空格上.下.左.右的相邻字母移到空格中. [输入] 初始网格和指令序列(以数字0结束) ...

  4. 【C/C++】例题3-6 环状序列/算法竞赛入门经典/数组和字符串

    [字典序比较] 对于两个字符串,比较字典序,从第一个开始,如果有两位不一样的出现,那么哪个的ASCII码小,就是字典序较小.如果都一样,那么短的小. [题目] 输入一个环状串,输出最小的字典序序列. ...

  5. 【C/C++】例题3-5 生成元/算法竞赛入门经典/数组与字符串

    [题目] x+x的各位数之和为y,x为y的生成元. 求10万以内的n的最小生成元,无解输出0. [解答] 这是我根据自己的想法最初写的代码: #include<cstdio> #inclu ...

  6. (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO

    http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...

  7. [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...

  8. 算法竞赛入门经典+挑战编程+USACO

    下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...

  9. [刷题]算法竞赛入门经典 3-12/UVa11809

    书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...

随机推荐

  1. js-sequence-diagrams > 时序图

    ... <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title ...

  2. Spring AOP及事务配置三种模式详解

    Spring AOP简述 Spring AOP的设计思想,就是通过动态代理,在运行期对需要使用的业务逻辑方法进行增强. 使用场景如:日志打印.权限.事务控制等. 默认情况下,Spring会根据被代理的 ...

  3. 用户案例 | 腾讯小视频&转码平台云原生容器化之路

    作者 李汇波,腾讯业务运维高级工程师,目前就职于TEG 云架构平台部 技术运营与质量中心,现负责微信.QQ社交类业务的视频转码运维. 摘要 随着短视频兴起和快速发展,对于视频转码处理的需求也越来越多. ...

  4. Maven 依赖调解源码解析(二):如何调试 Maven 源码和插件源码

    本文是系列文章<Maven 源码解析:依赖调解是如何实现的?>第二篇,主要介绍如何调试 Maven 源码和插件源码.系列文章总目录参见:https://www.cnblogs.com/xi ...

  5. <C#任务导引教程>练习四

    //27,创建一个控制台应用程序,声明两个DateTime类型的变量dt,获取系统的当前日期时间,然后使用Format格式化进行规范using System;class Program{    sta ...

  6. 探究 Go 源码中 panic & recover 有哪些坑?

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客: https://www.luozhiyun.com/archives/627 本文使用的go的源码1.17.3 前言 写这一篇文章的原因是 ...

  7. [hdu6580]Milk

    考虑定义以下dp数组:1.g1[i][j]表示第i行从中间出发向左取j瓶牛奶最少要多久2.g2[i][j]表示第i行从中间出发向右取j瓶牛奶最少要多久3.g3[i][j]表示在g1[i][j]的基础上 ...

  8. vue 事件监听和es6模板语法

    es6模板语法的反引号是通过左上角的飘字符弄出来了,学废了吗?

  9. 《手把手教你》系列技巧篇(四十五)-java+ selenium自动化测试-web页面定位toast-上篇(详解教程)

    1.简介 在使用appium写app自动化的时候介绍toast的相关元素的定位,在Web UI测试过程中,也经常遇到一些toast,那么这个toast我们这边如何进行测试呢?今天宏哥就分两篇介绍一下. ...

  10. BehaviorTree.CPP行为树BT的介绍(一)

    节点类型 ControlNode是可以具有1到N个子节点的节点.一旦接收到tick,tick可以传播到一个或多个子节点. DecoratorNodes与ControlNode相似,但只能有一个子节点. ...