【题目】

输入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. 什么?还在用delete删除数据《死磕MySQL系列 九》

    系列文章 五.如何选择普通索引和唯一索引<死磕MySQL系列 五> 六.五分钟,让你明白MySQL是怎么选择索引<死磕MySQL系列 六> 七.字符串可以这样加索引,你知吗?& ...

  2. Mui中mui.openWindow()方法具体参数信息(内容来自Mui问题专区)

    mui.openWindow({ url: 'xxx.html', //String类型,要打开的界面的地址 id: 'id', //String类型,要打开的界面的id styles: { //We ...

  3. ECharts 点击事件

    一个问题 ECharts 点击出现多个弹窗

  4. VS Code Java 更新 – 全新Gradle for Java插件,更方便的代码操作, 1.0 语言支持发布

    大家好,欢迎来到 9 月版的 Visual Studio Code Java 更新.在这篇文章中,我们将分享我们最新的Gradle插件,更加方便的代码操作(Getter/Setter等等),以及最近的 ...

  5. Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》

    目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表 ...

  6. Vue安装Vue Devtools调试工具提示 Error: Cannot find module '@vue-devtools/build-tools' 解决办法

    我看网络上面安装Vue Devtools 调试工具的步骤几乎都是按照文章链接里的步骤进行安装, 但是在最终执行编译命令的时候 :npm run build ,提示如下错误: 尝试了很多方法,都不能解决 ...

  7. [bzoj5340]假面

    修改:维护g[i][j]表示第i个数为j的概率,从前往后转移 转移方程:g[id][i]=g[id][i-1]*p+g[id][i]*(1-p),初始g[i][a[i]]=1 询问:对于每一个人i,输 ...

  8. [loj3302]信号传递

    由于n较大,可以将n个数中的关系对数量记录在$m*m$的矩阵中,记作$a[i][j]$ 考虑朴素的状压dp枚举排列,即$f[i]$表示以i中的数的一种排列为整个序列的前缀的最小代价,然后转移枚举下一个 ...

  9. 常用的分布式ID生成器

    为何需要分布式ID生成器 **本人博客网站 **IT小神 www.itxiaoshen.com **拿我们系统常用Mysql数据库来说,在之前的单体架构基本是单库结构,每个业务表的ID一般从1增,通过 ...

  10. 关闭 IDEA 自动更新

    关闭 IDEA 的自动检查更新(截图idea 2020 2.x) idea 右下角会有这样的更新提示 2. 关闭 idea 自动检查更新 取消勾选 Automatically check update ...