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系统基础之---账号管理(基于centos7.4 1708)
- Linux下安装google拼音输入法
首先安装fcitx,前几天看了很多在ubuntu上能够使用的输入法,有人推荐是搜狗输入法,毕竟是国产嘛,但是会有意外发生,比如说安装之后会产生输入的字符乱码,是一堆看不懂的东西,我就是因为遇到了,然后 ...
- Python的jieba模块简介
现如今,词云技术遍地都是,分词模块除了jieba也有很多,主要介绍一下jieba的基本使用 import jieba import jieba.posseg as psg from os import ...
- Big Truck
Photo by Phil Whitehouse Your boss has hired you to drive a big truck, transporting items between tw ...
- poj2230 欧拉回路
http://poj.org/problem?id=2230 Description Bessie's been appointed the new watch-cow for the farm. E ...
- BeyondCompare3 提示许可证密钥已被撤销解决方法
今天对比文件提示 许可证密钥已被撤销:3281-0350! 找过了几个注册码还是不行. 正确简单的解决方法: 1.找到 BCState.xml 文件 2.编辑器打开,删除<TCheckFor ...
- jackson 处理空值
@JsonInclude(value=Include.NON_NULL) public class ResultBean 这样在返回数据的时候, { "code": "s ...
- Qt Qwdget 汽车仪表知识点拆解5 标题栏图标闪烁
先贴上效果图,注意,没有写逻辑,都是乱动的 看下最上面的部分,有一些仪表图标在闪烁,如果一个一个写,也是可以实现的,不过感觉要累死的节奏 这里我写了一个我自己的Label,完了把把这些QLabel提升 ...
- C++知识点 内存占用问题
有一次去面试,谈的挺好的,被人问了一个问题,瞬间暴露自己基础能力弱的弱点了,这里自己记录下,以后慢慢长进. 问题 char test1[]={1,2,3,4}; char test2[]={1,2,3 ...
- 深入Python的类和对象
多态:不同的子类对象,可以调用相同的父类方法,通过改写父类的方法,产生不同的执行结果 instance和type的区别: instance能够顺延到父类,比对对象与父类是否类型一致.而type只能比对 ...