【C/C++】习题3-7 DNA/算法竞赛入门经典/数组与字符串
【题目】
输入m组n长的DNA序列,要求找出和其他Hamming距离最小的那个序列,求其与其他的Hamming距离总和。
如果有多个序列,求字典序最小的。
【注】这道题是我理解错误,不是找出输入的序列中和其他距离最小的,而是找到一个DNA序列到所有其他的序列距离最小。
正确方法是统计每一位的AGCT出现频次,然后找到每一位出现最多的。
因为只有AGCT,所以可以用一个dict char dict = "AGCT"
这样的套路存储。
【知识点】
- 字典序比较: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/算法竞赛入门经典/数组与字符串的更多相关文章
- 【C/C++】习题3-4 周期串/算法竞赛入门经典/数组和字符串
[题目] 如果某个字符串可以由长度为k的字符串重复多次得到,则称该串以k为周期. 输入一个长度不超过80的字符串,输出最小周期. [思路] 暴力求解.依次考察周期1~长度n. 筛选:周期一定是长度n的 ...
- 【C/C++】习题3-3 数数字/算法竞赛入门经典/数组和字符串
[题目] 把前n个(n<=10000)的整数顺序写在一起:123456789101112-- 数一数0~9各出现多少次(输出10个整数,分别是0,1,2,--,9出现的次数) [解答] 暴力求解 ...
- 【C/C++】习题3-5 谜题/算法竞赛入门经典/数组和字符串
[题目] 有一个5*5的网络,恰好有一个格子是空的(空格),其他格子各有一个字母. 指令:A, B, L, R 把空格上.下.左.右的相邻字母移到空格中. [输入] 初始网格和指令序列(以数字0结束) ...
- 【C/C++】例题3-6 环状序列/算法竞赛入门经典/数组和字符串
[字典序比较] 对于两个字符串,比较字典序,从第一个开始,如果有两位不一样的出现,那么哪个的ASCII码小,就是字典序较小.如果都一样,那么短的小. [题目] 输入一个环状串,输出最小的字典序序列. ...
- 【C/C++】例题3-5 生成元/算法竞赛入门经典/数组与字符串
[题目] x+x的各位数之和为y,x为y的生成元. 求10万以内的n的最小生成元,无解输出0. [解答] 这是我根据自己的想法最初写的代码: #include<cstdio> #inclu ...
- (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO
http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...
- [刷题]算法竞赛入门经典 3-7/UVa1368 3-8/UVa202 3-9/UVa10340
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 都是<算法竞赛入门经典(第二版)>的题目,标题上没写(第二版) 题目:算法竞赛入门经典 3-7/UVa13 ...
- 算法竞赛入门经典+挑战编程+USACO
下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...
- [刷题]算法竞赛入门经典 3-12/UVa11809
书上具体所有题目:http://pan.baidu.com/s/1hssH0KO 题目:算法竞赛入门经典 3-4/UVa11809:Floating-Point Numbers 代码: //UVa11 ...
随机推荐
- 什么?还在用delete删除数据《死磕MySQL系列 九》
系列文章 五.如何选择普通索引和唯一索引<死磕MySQL系列 五> 六.五分钟,让你明白MySQL是怎么选择索引<死磕MySQL系列 六> 七.字符串可以这样加索引,你知吗?& ...
- Mui中mui.openWindow()方法具体参数信息(内容来自Mui问题专区)
mui.openWindow({ url: 'xxx.html', //String类型,要打开的界面的地址 id: 'id', //String类型,要打开的界面的id styles: { //We ...
- ECharts 点击事件
一个问题 ECharts 点击出现多个弹窗
- VS Code Java 更新 – 全新Gradle for Java插件,更方便的代码操作, 1.0 语言支持发布
大家好,欢迎来到 9 月版的 Visual Studio Code Java 更新.在这篇文章中,我们将分享我们最新的Gradle插件,更加方便的代码操作(Getter/Setter等等),以及最近的 ...
- Redis | 第一部分:数据结构与对象 上篇《Redis设计与实现》
目录 前言 1. 简单动态字符串 1.1 SDS的定义 1.2 空间预分配与惰性空间释放 1.3 SDS的API 2. 链表 2.1 链表与节点的定义 2.2 链表的API 3. 字典 3.1 哈希表 ...
- Vue安装Vue Devtools调试工具提示 Error: Cannot find module '@vue-devtools/build-tools' 解决办法
我看网络上面安装Vue Devtools 调试工具的步骤几乎都是按照文章链接里的步骤进行安装, 但是在最终执行编译命令的时候 :npm run build ,提示如下错误: 尝试了很多方法,都不能解决 ...
- [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,输 ...
- [loj3302]信号传递
由于n较大,可以将n个数中的关系对数量记录在$m*m$的矩阵中,记作$a[i][j]$ 考虑朴素的状压dp枚举排列,即$f[i]$表示以i中的数的一种排列为整个序列的前缀的最小代价,然后转移枚举下一个 ...
- 常用的分布式ID生成器
为何需要分布式ID生成器 **本人博客网站 **IT小神 www.itxiaoshen.com **拿我们系统常用Mysql数据库来说,在之前的单体架构基本是单库结构,每个业务表的ID一般从1增,通过 ...
- 关闭 IDEA 自动更新
关闭 IDEA 的自动检查更新(截图idea 2020 2.x) idea 右下角会有这样的更新提示 2. 关闭 idea 自动检查更新 取消勾选 Automatically check update ...