题目:https://www.luogu.org/problemnew/show/P1140

分析:

本题一看就知道是一道动归,其实和字串距离非常的像,只不过多了题目规定的匹配相似度罢了。

匹配的相似度我们之间用一个二维数组读入即可

int shuzu[6][6]={{0,0,0,0,0,0},{0,5,-1,-2,-1,-3},{0,-1,5,-3,-2,-4},{0,-2,-3,5,-2,-2},{0,-1,-2,-2,5,-1},{0,-3,-4,-2,-1,0}};

PS:换行效果更佳。

然后要把字符串转化成刚才数组中的下标,便于读写

int start(char c)
{
if(c=='A')return 1;
if(c=='C')return 2;
if(c=='G')return 3;
if(c=='T')return 4;
}

然后直接在主函数中调用即可

之后就是调用问题

for(int i=0;i<n;i++)
{
a[i+1]=start(s1[i]);
}
for(int j=0;j<m;j++)
{
b[j+1]=start(s2[j]);
}

其中s1,s2均为读入的字符串,我们把它们分别逐字符转化放入a,b数组。

然后由于有负值出现,我们需要把动归的核心方程初始化为一个极小的负数

for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
f[i][j]=-2147483647;
}
}

然后就是关键的动归核心部分了。

首先,看到数据范围:100

受到启发:二位数组开的起,再加上字串距离的引导,我们很容易想到f[i][j]f[i][j]f[i][j]可以表示第一个字符串的前i个字符与第二个字符串的前j个字符匹配的最大值。

状态想出来,那么方程如何转移呢?

根据可以加入空碱基,我们能想到

f[i][j]=max(f[i][j],f[i−1][j]+shuzu[a[i]][5],f[i][j−1]+shuzu[b[j]][5],f[i−1][j−1]+shuzu[a[i]][b[i]]f[i][j]=max(f[i][j],f[i-1][j]+shuzu[a[i]][5],f[i][j-1]+shuzu[b[j]][5],f[i-1][j-1]+shuzu[a[i]][b[i]]f[i][j]=max(f[i][j],f[i−1][j]+shuzu[a[i]][5],f[i][j−1]+shuzu[b[j]][5],f[i−1][j−1]+shuzu[a[i]][b[i]]

分别是s1串的最后一个字符对应一个空字符,s2串的最后一个字符对应一个空字符,s1串个s2串的最后一个字符直接对应。

显而易见的,初始化f数组就是

for(int i=1;i<=n;i++)f[i][0]=f[i-1][0]+shuzu[a[i]][5];
for(int i=1;i<=m;i++)f[0][i]=f[0][i-1]+shuzu[b[i]][5];

然后把它们拼凑起来,就完工喽!

完结撒花~

洛谷P1140 相似基因的更多相关文章

  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】

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

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

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

  5. 洛谷 P1140 相似基因 题解

    每日一题 day23 打卡 Analysis dp[i][j]表示序列A中前i个与序列B中前j个匹配的相似度最大值 所以,dp方程很容易想到: 1.让a[i]与b[j]匹配 2.让a[i]与B序列中一 ...

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

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

  7. 【洛谷P1140 相似基因】动态规划

    分析 f[i][j] 表示 1数组的第i位和2数组的第j位匹配的最大值 f[1][1]=-2 f[2][1]=-2+5=3 f[3][1]=-2+5+5=8 三个决策: 1.由f[i-1][j-1]直 ...

  8. 洛谷P1140 基因匹配 //DP真正意义上的一血

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

  9. 【线型DP】【LCS】洛谷P4303 [AHOI2006]基因匹配

    P4303 [AHOI2006]基因匹配 标签(空格分隔): 考试题 nt题 LCS优化 [题目] 卡卡昨天晚上做梦梦见他和可可来到了另外一个星球,这个星球上生物的DNA序列由无数种碱基排列而成(地球 ...

随机推荐

  1. HDFS的几点改进

    HDFS(Hadoop Distributed File System)是一个运行在商用机器上面的分布式文件系统,其设计思想来自于google著名的Google File System论文. HDFS ...

  2. 理解typedef(转)

    // 从别人那转的,调整下格式便于阅读. 首先请看看下面这两句: typedef ]; typedef void (*p)(void); 如果你能一眼就看出它们的意思,那请不要再往下看了.如果你不太理 ...

  3. WPF使用AForge实现Webcam预览(二)

    本文主要介绍如何让摄像头预览界面的宽高比始终在16:9. 首先我们需要修改一下上一篇随笔实现的UI界面,让Grid变成一个3*3的九宫格,预览界面位于正中间.Xaml示例代码如下: <Windo ...

  4. Qt 使用 Google Breakpad 捕获程序崩溃报告(dump文件) good

    http://blog.csdn.net/GoForwardToStep/article/details/56685810

  5. Windows环境下使用Node.js

    作者:短工邦技术部 - 陈文哲 Parse用的就是Node.js,所以我们要先了解什么是Node.js,以及做一些简单的操作. Node.js 的主要思路是:使用非阻塞的,事件驱动的 I/O 操作来保 ...

  6. The Portable Executable File Format from Top to Bottom(每个结构体都非常清楚)

    The Portable Executable File Format from Top to Bottom Randy KathMicrosoft Developer Network Technol ...

  7. 代理Delegate的小应用(使用setModelData设置下拉日期对话框)

    前言 在平时关于表格一类的的控件使用中,不可避免需要修改每个Item的值,通过在Item中嵌入不同的控件对编辑的内容进行限定,然而在表格的Item中插入的控件始终显示,当表格中item项很多的时候,会 ...

  8. ***R(TCP over UDP,UDP over TCP)

    https://github.com/breakwa11/shadowsocks-rss

  9. Linux虚拟机没有IP的解决办法

    这里之所以是查看下IP ,是我们后面要建一个Centos远程工具Xshell 连接Centos的时候,需要IP地址,所以我们这里先 学会查看虚拟机里的Centos7的IP地址 首先我们登录操作系统 用 ...

  10. ansible(二)

    一.软件相关模块 1.yum(下载包) 正常操作 yum 与rpm的区别 yum可以解决依赖关系rpm 全称readhat package manager(红帽包管理工具),需要自己解决依赖 yum源 ...