P1140 相似基因
题目背景
大家都知道,基因可以看作一个碱基对序列。它包含了4种核苷酸,简记作A,C,G,T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。
在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。
题目描述
两个基因的相似度的计算方法如下:
对于两个已知基因,例如AGTGATG和GTTAG,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如:

这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示:

那么相似度就是:(-3)+5+5+(-2)+(-3)+5+(-3)+5=9。因为两个基因的对应方法不唯一,例如又有:

相似度为:(-3)+5+5+(-2)+5+(-1)+5=14。规定两个基因的相似度为所有对应方法中,相似度最大的那个。
输入输出格式
输入格式:
共两行。每行首先是一个整数,表示基因的长度;隔一个空格后是一个基因序列,序列中只含A,C,G,T四个字母。1<=序列的长度<=100。
输出格式:
仅一行,即输入基因的相似度。
输入输出样例
7 AGTGATG
5 GTTAG
14
Solution:
本题是一道比较典型的$DP$。
我们先考虑定义状态,$f[i][j]$表示匹配到了$s1$的$i$位置和$s2$的$j$位置时,能匹配到的最大基因相似度,那么目标状态即$f[n][m]$。
转换碱基,将$A\leftrightarrow 0,C\leftrightarrow 1,G\leftrightarrow 2,T\leftrightarrow 3,-\leftrightarrow 4$,然后把$s1,s2$按上述方法映射为$a,b$,同时建立$w[5][5]$数组,$w[i][j]$表示$i-j$配对的值。
先考虑初始状态,$f[i][j],i\in [1,n],\;j\in [1,m]$初始化为负无穷,因为可以与空碱基匹配,所以初始时$f[i][0]=f[i-1][0]+w[a[i]][4],i\in [1,n]$表示$s1$的每位与空碱基配对的值,$f[0][i]=f[0][i-1]+w[b[i]][4],i\in [1,m]$含义同上。
再考虑中间状态转移,可以发现上一个状态向下一个状态转移时,只有三种情况:
1、$f[i][j]=max(f[i][j],f[i][j-1]+w[b[j]][4])$表示$s1_i$在$s2_j$位置时与空碱基配对;
2、$f[i][j]=max(f[i][j],f[i-1][j]+w[a[i]][4])$表示$s2_j$在$s1_i$位置时与空碱基配对;
3、$f[i][j]=max(f[i][j],f[i-1][j-1]+w[a[i]][b[j]])$表示$s1_i$和$s2_j$配对。
容易想到对于$s1$的每个位置,都可以与$s2$的每个位置匹配一次,所以整体枚举复杂度为$O(nm)$($n$为$s1$长度,$m$为$s2$长度)。
最后输出目标状态$f[n][m]$就$OK$了。
代码:
#include<bits/stdc++.h>
#define il inline
#define ll long long
using namespace std;
const int inf=;
int n,m,f[][],a[],b[];
int w[][]=
{
{,-,-,-,-},
{-,,-,-,-},
{-,-,,-,-},
{-,-,-,,-},
{-,-,-,-,}
};
char s1[],s2[];
il void change(char *s,int *a,int l){
for(int i=;i<=l;i++){
if(s[i]=='A')a[i]=;
if(s[i]=='C')a[i]=;
if(s[i]=='G')a[i]=;
if(s[i]=='T')a[i]=;
}
}
int main()
{
scanf("%d%s%d%s",&n,s1+,&m,s2+);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)f[i][j]=-inf;
change(s1,a,n),change(s2,b,m);
for(int i=;i<=n;i++)f[i][]=f[i-][]+w[a[i]][];
for(int i=;i<=m;i++)f[][i]=f[][i-]+w[b[i]][];
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
f[i][j]=max(f[i][j],f[i][j-]+w[b[j]][]);
f[i][j]=max(f[i][j],f[i-][j]+w[a[i]][]);
f[i][j]=max(f[i][j],f[i-][j-]+w[a[i]][b[j]]);
}
cout<<f[n][m];
return ;
}
P1140 相似基因的更多相关文章
- 洛谷P1140 相似基因 (DP)
洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...
- 洛谷 P1140 相似基因(DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 参考资料: [1]:https://www.cnblogs.com/real-l/p/9 ...
- 洛谷P1140 相似基因【线性dp】
题目:https://www.luogu.org/problemnew/show/P1140 题意: 给定两串基因串(只包含ATCG),在其中插入任意个‘-’使得他们匹配.(所以一共是5种字符) 这5 ...
- P1140 相似基因(字符串距离,递推)
题目链接: https://www.luogu.org/problemnew/show/P1140 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C, ...
- P1140 相似基因 (dp)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务 ...
- P1140 相似基因 这个和之前有一个题目特别像 dp
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- P1140 相似基因 最长公共子序列
思路 类似于最长公共子序列 把一段基因和另外一段基因匹配 不够长的用空基因替换 #include<bits/stdc++.h> using namespace std; const in ...
- luogu P1140 相似基因
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了4种核苷酸,简记作A,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务中,生物学家研究 ...
- P1140 相似基因 (动态规划)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了4种核苷酸,简记作A,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务中,生物学家研究 ...
随机推荐
- linux系统下病毒排除思路
1.top查看是否有特别吃cpu和内存的进程,病毒进程kill是杀不死的,因为ps命令被修改 2.ls -la /proc/病毒进程pid/ pwd为病毒进程程序目录 一般在/usr/bin下 3. ...
- MFC下的DLL编程学习
1.DLL库与LIB库对比: 静态链接库Lib(Static Link Library),是在编译的链接阶段将库函数嵌入到应用程序的内部.如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造 ...
- 《高性能MySQL》笔记——MySQL建表数据类型的选择
前段时间看了<高性能MySQL>中的选择优化的数据类型,这里主要是做一下笔记. 首先数据选择有几个简单原则: 更小的通常更好.一般情况下,应该尽量使用可以正确存储数据的最小数据类型.例如只 ...
- plsql 连接数据库无法解析指定的连接标识符
之前用plsql连接的时候一直出问题,报无法解析指定的连接标识符,但是我加上ip地址就可以连接上. 我百度了很久,有说如下图选择oracle home的,有说清空admin目录下的所有文件, 但是都不 ...
- MySQL 主从服务器配置
在主服务器Ubuntu上进行备份,执行命令: mysqldump -uroot -p --all-databases --lock-all-tables > ~/master_db.sql -u ...
- Leecode刷题之旅-C语言/python-118杨辉三角
/* * @lc app=leetcode.cn id=118 lang=c * * [118] 杨辉三角 * * https://leetcode-cn.com/problems/pascals-t ...
- hadoop jar x.jar 执行过程
hadoop jar x.jar 执行过程 Yarn框架执行内容 1,job.waitforcompletion() 启动 Runjar 进程 -> Resourcemanage申请一个j ...
- 利用JS调取电脑摄像头,实现拍照功能
1.调取电脑摄像头非常简单,看代码一幕了然 window.addEventListener("DOMContentLoaded", function() { var canvas ...
- WPF中InkCanvas(墨水面板)用法
原文:WPF中InkCanvas(墨水面板)用法 WPF中InkCanvas(墨水面板)用法 ...
- linux-clone-ip处理办法
vim /etc/udev/rules.d/70-persistent-net.rules 步骤1:#将eth0相关的文件给删除 步骤2:#vi /etc/sysconfig/network-scri ...