最近博客更不起来...然后又(照例)犯鼻炎了唉难受。

题目传送门

我们首先可以预处理碱基间的权值表。然后讲读入的碱基转化为数字,就变成了“数字匹配使权值最大”的问题。我们显然可以用动态规划解决。

两个序列配对上的dp状态设计相似,以前做过一道编辑距离也是类似配对的问题。

设f[i][j]表示第一个基因当前位置到了第i个碱基,第二个基因当前位置到了第j个碱基所能得到的最大相似度。

转移:lena*lenb 而且和状态也没有什么地方可以优化了。

决策:我们可以在每一次转移的时候有3种决策:

                      A串留空/B串留空/AB恰好匹配

预处理:当一个串与另一个(完全)空的串匹配时显然只有一种情况,所有状态开始由他转移而来。

     for(int i=;i<=lenb;i++) f[][i]=f[][i-]+w[b[i]][];
for(int i=;i<=lena;i++) f[i][]=f[i-][]+w[a[i]][];

然鹅...在这被坑了,由于有负数的权值,还要再赋一个负无穷的初值,以及f[0][0]=0!!!

Code

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> using namespace std; int lena,lenb;
int w[][];
int a[],b[],f[][];
char A[],B[]; void init()
{
for(int i=;i<=;i++) w[i][i]=;
w[][]=w[][]=w[][]=w[][]=w[][]=w[][]=-;
w[][]=w[][]=w[][]=w[][]=-;
w[][]=w[][]=w[][]=w[][]=w[][]=w[][]=w[][]=w[][]=-;
w[][]=w[][]=-;
}
int main()
{
init();
/*for(int i=1;i<=5;i++)
{
for(int j=1;j<=5;j++)
printf("%d ",w[i][j]);
printf("\n");
}*/ scanf("%d",&lena);
scanf("%s",A+);
for(int i=;i<=lena;i++)
{
if(A[i]=='A') a[i]=;
if(A[i]=='C') a[i]=;
if(A[i]=='G') a[i]=;
if(A[i]=='T') a[i]=;
}
scanf("%d",&lenb);
scanf("%s",B+);
for(int i=;i<=lenb;i++)
{
if(B[i]=='A') b[i]=;
if(B[i]=='C') b[i]=;
if(B[i]=='G') b[i]=;
if(B[i]=='T') b[i]=;
}
memset(f,,sizeof(f));
f[][]=;
for(int i=;i<=lenb;i++) f[][i]=f[][i-]+w[b[i]][];
/* for(int i=1;i<=lenb;i++)
printf("%d ",f[0][i]);*/
for(int i=;i<=lena;i++) f[i][]=f[i-][]+w[a[i]][];
for(int i=;i<=lena;i++)
for(int j=;j<=lenb;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[b[j]][]);
f[i][j]=max(f[i][j],f[i-][j-]+w[a[i]][b[j]]);
}
printf("%d",f[lena][lenb]);
return ;
}

Luogu P1140 相似基因 【dp】By cellur925的更多相关文章

  1. 洛谷P1140 相似基因 (DP)

    洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...

  2. 洛谷 P1140 相似基因(DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 参考资料: [1]:https://www.cnblogs.com/real-l/p/9 ...

  3. P1140 相似基因 (dp)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务 ...

  4. luogu P1140 相似基因

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了4种核苷酸,简记作A,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务中,生物学家研究 ...

  5. 洛谷P1140 相似基因【线性dp】

    题目:https://www.luogu.org/problemnew/show/P1140 题意: 给定两串基因串(只包含ATCG),在其中插入任意个‘-’使得他们匹配.(所以一共是5种字符) 这5 ...

  6. 洛谷P1140 相似基因(线性DP)

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  7. P1140 相似基因 这个和之前有一个题目特别像 dp

    题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...

  8. Luogu P4933 大师【dp】By cellur925

    题目传送门 题目大意:给你一个序列,求子序列为等差数列的子序列个数.序列长度$n<=2000$,最高的塔高$v<=20000$. 这种计数类的题,大概就是dp的套路了⑧.开始设计的是一个错 ...

  9. 洛谷 P1140 相似基因 ( 线性DP || 类LCS )

    题意 : 题目链接 分析 :  可以观察到给出的配对代价表中对角线部分是正数 其余的都是负数,也就是说让相同字母的匹配的越多越好 即找出 LCS 但是这里 DP 的过程需要记录一下代价 有关 LCS ...

随机推荐

  1. 洛谷——P1451 求细胞数量

    P1451 求细胞数量 题目描述 一矩形阵列由数字0到9组成,数字1到9代表细胞,细胞的定义为沿细胞数字上下左右若还是细胞数字则为同一细胞,求给定矩形阵列的细胞个数.(1<=m,n<=10 ...

  2. com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown error 1054

    com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown error 1054 这个错误困扰了我一个下午  插入数据总是错误 ...

  3. How To Configure a Redis Cluster on Ubuntu 14.04

    原文:https://www.digitalocean.com/community/tutorials/how-to-configure-a-redis-cluster-on-ubuntu-14-04 ...

  4. No module named '_sqlite3'问题解决

    Centos自带的python版本是2.7的,后面我自己装了3.5版本的,在创建应用的时候python manager.py startapp users 时,就会报No module named ' ...

  5. Java静态分派与动态分派(二)

    方法调用并不等于方法执行,方法调用阶段唯一的任务就是确定被调用方法的版本(即调用哪一个方法),暂时还不涉及方法内部的具体运行过程. 在程序运行时,进行方法调用是最普遍.最频繁的操作,但是Class文件 ...

  6. [libcurl]_[0基础]_[使用libcurl下载大文件]

    场景: 1. 在Windows编程时, 下载http页面(html,xml)能够使用winhttp库,可是并非非常下载文件,由于会失败. 由此引出了WinINet库,无奈这个库的稳定性比較低,使用样例 ...

  7. Hadoop之中的一个:Hadoop的安装部署

    说到Hadoop不得不说云计算了,我这里大概说说云计算的概念,事实上百度百科里都有,我仅仅是copy过来,好让我的这篇hadoop博客内容不显得那么单调.骨感.云计算近期今年炒的特别火,我也是个刚開始 ...

  8. Fluently NHibernate映射多个实体程序集

    Fluently NHibernate有个好处就是可以在代码里定义实体类,而不必写冗长的XML. 但通常,一个项目对应的所有的实体类,都编译成一个DLL.如果有个项目,是在某个父项目的基础上再扩展,那 ...

  9. oracle 10g 实例用localhost无法访问的处理

    我在笔记本上安装了一个Oracle10g,安装好了之后,查看E:\oracle\product\10.2.0\db_1\network\ADMIN\tnsnames.ora文件,发现SID对应的IP地 ...

  10. 不同linux版本下内核/系统/软件的安装及查询

    (一)先介绍下使用apt-get 和使用yum 包管理工具的不同用法: 1.先看yum(redhat) yum的配置文件是/etc/yum.conf 更新:yum update 安装:yum inst ...