PTA 2 新冠状病毒的基因序列(动态规划)
2019年12月下旬,武汉出现了多例不明原因的病毒性肺炎病例。之后,中国疾病预防控制中心确定此次致病的病原体为一种新的冠状病毒。1月12日,世界卫生组织将其命名为“2019新型冠状病毒(2019-nCoV)”。为了弄清新型冠状病毒的起源,中国疾控中心等机构的研究人员对住院患者的样本进行高通量测序,获得了完整和部分的2019-nCoV基因组序列。接着对这些2019-nCoV基因组和其他冠状病毒的基因组开展系统进化分析,以便确定这些病毒的进化史,帮助推断其可能的来源。
上述的研究就属于计算机和生物医学的交叉领域的相关研究,我们称之为生物信息学。在生物信息学中,我们以DNA为例说明基因序列的相似度研究。DNA (脱氧核糖核酸 )是生命体中主要的遗传物质 , 能将遗传信息由亲代传到子代. 它是一种线性 多聚脱氧核糖核苷酸 , 由碱基、戊糖及磷酸组成. 所有 DNA的主链均相同 , 只是腺嘌呤 (A)、鸟嘌呤(G)、胞嘧啶 (C)和胸腺嘧啶 (T)这 4种碱基的排列顺序不同. 不同生物体的 DNA具有自己独特的碱基顺序 , 遗传信息是由碱基顺序体现的 , 所以 , 进行 DNA序列的比较 (即观察 4种碱基在主链上的排列顺序 )是非常重要的. 通过比较不同物种的 DNA序列 , 得出其相似度 , 从而可以推断出物种间亲缘关系的远近.。
现在给你两个由AGCT四个字母构成的字符串,请你求出两个DNA序列的最长公共子序列。
输入格式:
两行,每行一个字符串,分别表示一个DNA序列(每个字符串长度不超过1000)。
输出格式:
一个数,最长公共子序列元素的个数。
输入样例:
在这里给出一组输入。例如:
AGCT
ATT
结尾无空行
输出样例:
在这里给出相应的输出。例如:
2
结尾无空行
分析:这道题是求最长公共子序列,注意不是最长公共子串。这两个是有去别的。例如ABCDEFG和ABCFGH。最长公共子序列是ABCFG,而最长公共子串是ABC。现在求两个串里的最长公共子序列。现在设两个串未X[n]={x1,x2,x3...xn}和Y[n]={y1,y2,y3....yn}。Z[n]用来存每个元素的最长公共子序列的值。
(1)如果X[n]==Y[n],则Z[n]=X[n]或者Z[n]=Y[n],那么“剩下的”最长公共子序列一定在X[n-1]和Y[n-1]中。
(2)如果X[n]!=Y[n],而Z[n]!=X[n]或者Z[n]!=Y[n],则最长公共子序列一定在X[n-1],Y[n] 和 X[n]和有Y[n-1]之间的较大值。
这个公式分析可能第一次比较不好懂,在读的同时,自己用笔写一下,画一下。读者可以再参考其他人写的,加深理解。
因为这里是从后往前推,最大值是Z[0]。
如果是从前往后推的话,最大值是Z[n]。而我是从前往后推。
代码如下:
#include<stdio.h>
#include<string.h>int Max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int i, j;
char a[1001] = { 0 }, b[1001] = { 0 };
int f[1001][1001] = { 0 };//这个元素的意义是X[i]和Y[j]之间的最长公共子序列
gets(a);
gets(b);
int n = strlen(a);
int m = strlen(b);
for (i = 1; i <= n; i++)
{
for (j = 1; j <= m; j++)
{
if (a[i - 1] == b[j - 1])
{
f[i][j] = f[i - 1][j - 1] + 1;
}
else
{
f[i][j] = Max(f[i - 1][j], f[i][j - 1]);
}
}
}
printf("%d\n", f[n][m]);
return 0;
}
请读者思考?答案为什么是f[n][m]?而不是f[n-1][m-1]?
PTA 2 新冠状病毒的基因序列(动态规划)相关推荐
- 新冠状病毒的基因序列
2019年12月下旬,武汉出现了多例不明原因的病毒性肺炎病例.之后,中国疾病预防控制中心确定此次致病的病原体为一种新的冠状病毒.1月12日,世界卫生组织将其命名为"2019新型冠状病毒(20 ...
- 新冠状病毒显微放大品质背景,让你做相关项目更具专业性。
如果你在做关于新冠状病毒项目研究或是宣传,是否为了专业性的图片素材而烦恼? 无论你是如何使用图片素材,它的作用是通过高度可视化,以最简洁直观的方式把想要表达的内容和信息传递出 去,这就是平面设计的目的 ...
- 从SARS、埃博拉到新冠状病毒,技术在革命中进步
从去年年底一直到现在,疫情沸沸扬扬,科技向善带给我们福音.在这场悄无声息没有硝烟的战场上,除了为这场疫情贡献力量的每个人之外,科技也已经踏上了征途,帮助世界战胜疫情. 新冠状病毒 科技与人类专业知识 ...
- 新冠状病毒死亡率问题
新冠状病毒死亡率问题 用python三种对于格式的控制方法输出 a = 81/2844 b = 100*a c = '%' print(f'{b:.2f}%') print('{:.2f}%'.for ...
- python爬取新冠状病毒实时数据,绘制各省份疫情地图
想法: 偶然接触爬虫之后,想要试试爬取新冠状病毒的数据,但本人是编程小白,只能从网上寻找代码进行学习,在看过博主Hakuna_Matata_001的代码之后,可以说是将其默写出来了,然后加入了自己的一 ...
- 疫情地图制作--根据“天元浪子”大作学习制作全国新冠状病毒肺炎分布图
疫情地图制作 –根据"天元浪子"大作学习制作全国新冠状病毒肺炎分布图 话不多说,直接贴博主"天元浪子"的帖子,记得给原文博主投票哈.' https://blog ...
- 靶向新冠状病毒(COVID-19)的药物靶点
冠状病毒(Coronavirus, CoV)是自然界广泛存在一大类病毒家族.CoV为有包膜病毒,颗粒呈圆形或椭圆形,具有多形性,直径50-200nm.颗粒表面有棒状突起,使病毒表面看起来形如花冠,故而 ...
- 2019新冠状病毒学习笔记
最近这波疫情,重现当年初中非典时期,甚至愈演愈烈,与之前初中时的封校住宿学习不同,已经工作的今天和太多的互联网信息大爆炸让我们有些焦虑,特别是,作为学习生物的人,我们也感到无能为力.官方媒体的科普,已 ...
- 新水果取名(动态规划,求两个子序列的最短原序列)
题目内容: 两种水果杂交出一种新水果,现在给新水果取名,要求这个名字中包含以前两种水果的字母,且名字尽量短,即:以前的水果名字arr1.arr2是新水果名arr12的子序列,使用动态规划的思想设计算法 ...
最新文章
- php与html交互实现登录,php与html实现交互的基本操作
- 15-07-10 结构体-输入学生成绩进行排序
- 句柄 matlab_matlab 整车仿真
- php获取ios,IOS 通过描述获取UDID PHP代码版
- beanutils获取带参数get方法
- 微服务升级_SpringCloud Alibaba工作笔记0015---Nacos安装
- switch的处理方法
- maven 在pom.xml 中指定仓库位置
- how to get keyboard key with non blocking in terminal
- 高斯过程回归预测 C++代码实现
- 如何打开cmd窗口及一些常用Dos命令
- linux包含两种设备文件,在Linux系统中/dev的目录详解
- KingRoot换成Supersu的方法
- 什么是真正的转运?常见的五种转运方法
- java怎么画八卦图_自己画八卦图怎么画?电脑绘制八卦图|八卦图的简单画法
- 单点登录SSO(Single Sign On)
- 和菜鸟一起学android4.0.3源码之vibrator振动器移植心得
- vue 移动端头像裁剪_移动端 上传头像 并裁剪功能(h5)
- [网络工程师]-防火墙-入侵防护系统IPS
- 周慧敏张曼玉关之琳赵雅芝 风华绝代不畏岁月