【题目】

输入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. 菜鸟Markdown笔记,看这个就够了

    菜鸟markdown语法笔记 1.标题 写法:共六级标题,一个#是一级标题,两个#是二级标题,三个#是三级标题······以此类推 (#)+空格键,快捷方式是Ctrl+1/2/3/4/5/6 2.段落 ...

  2. Debug代码调试

    Debug代码调试 第一步在代码左侧先点一个红点 第二步右键选择Debug运行 第三步点击Step Into按键分步进行 练习题: s2 = 'python python python python ...

  3. 本机不安装Oracle客户端,使用instantclient_11_2和PLSQL Developer连接Oracle远程数据库步骤

     前言:由于Orcale客户端,占用空间太大,我们选择安装installclient\PLSQL客户端对orcale进行数据库连接. 安装要求.installClient要与PLSQL的安装位数一致, ...

  4. JS中bind、call和apply的作用以及在TS装饰器中的用法

    目录 1,前言 1,call 1.1,例子 1.2,直接调用 1.3,将this指向另一个对象 1.4,传递参数 2,apply 2.1,例子 2.2,直接调用 2.3,将this指向另一个对象 2. ...

  5. [cf643G]Choosing Ads

    首先对于$p>50$,有经典的做法,即不断删去区间中不同的两数,最终剩下的即为出现次数超过一半的数(或没有),用线段树维护即可 那么对于$p\le 50$,类似的,即删去区间中不同的$\lflo ...

  6. 【JavaSE】字符编码和存储编码

    字符编码和存储编码 2019-07-15  22:34:51  by冲冲 1. 英文字母和中文汉字在不同字符集编码下的字节数不同. 英文字母 字节数 : 1; 编码:GB2312 字节数 : 1; 编 ...

  7. 一个 Linux 后台程序编程案例分析

    Linux 下的一个进程打开一个日志文件,不定期地往该文件里写入日志.此时可以在控制台使用 mv 命令给该日志文件改个名字或者用 rm 命令把这个日志文件删除掉.Linux 下是允许这么干的!对于改日 ...

  8. Codeforces 79D - Password(状压 dp+差分转化)

    Codeforces 题目传送门 & 洛谷题目传送门 一个远古场的 *2800,在现在看来大概 *2600 左右罢( 不过我写这篇题解的原因大概是因为这题教会了我一个套路罢( 首先注意到每次翻 ...

  9. [源码解析] PyTorch 分布式 Autograd (4) ---- 如何切入引擎

    [源码解析] PyTorch 分布式 Autograd (4) ---- 如何切入引擎 目录 [源码解析] PyTorch 分布式 Autograd (4) ---- 如何切入引擎 0x00 摘要 0 ...

  10. miRNA 基本知识

    miRNA MicroRNA (miRNA)  是一类内生的.长度约为20-24个核苷酸的小 RNA,其在细胞内具有多种重要的调节作用.每个 miRNA 可以有多个靶基因的表达,而几个 miRNA 也 ...