洛谷 P1140 相似基因 ( 线性DP || 类LCS )
题意 : 题目链接
分析 :
可以观察到给出的配对代价表中对角线部分是正数
其余的都是负数,也就是说让相同字母的匹配的越多越好
即找出 LCS 但是这里 DP 的过程需要记录一下代价
有关 LCS 的一篇博客 ==> Click here
如果不是计算长度而是计算配对的价值,那么初始化的时候
记得将每一个串的字母作为结尾与空串配对的价值初始化一下
即 dp[i][0] 与 dp[0][i]
#include<bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
;
][] = {
{, -, -, -, -},
{-, , -, -, -},
{-, -, , -, -},
{-, -, -, , -},
{-, -, -, -, -INF}
};
char str1[maxn], str2[maxn];
map<char, int> mp;
int dp[maxn][maxn];
int main(void)
{
mp[,
mp[,
mp[,
mp[,
mp[;
memset(dp, -INF, sizeof(dp));
int N, M;
scanf("%d", &N);
; i<=N; i++) scanf(" %c", &str1[i]);
scanf("%d", &M);
; i<=M; i++) scanf(" %c", &str2[i]);
dp[][] = ;
; i<=N; i++) dp[i][] = dp[i-][] + cost[mp[str1[i]]][];
; i<=M; i++) dp[][i] = dp[][i-] + cost[][mp[str2[i]]];
/*
对于上面这两个 for 循环的初始化,实际上就是对每一个串到 i 为结尾与一个空串
做匹配的结果,即到 i 为止,整个串与空碱基做匹配的代价,这个初始化是有必要的
举个例子
1 A
3 TGC
没有这个初始化的话 错误答案就是 -7 对应如下情况
---
TGC
实际最优的情况是 -4 对应如下情况
--A
TGC
因为没有这个初始化,dp[1][j] 的情况不能从 dp[i-1][j-1] 转移而来
即让第一个串的第 1 字符与当前第二个串的第 j 个字符做匹配的代价
对于LCS这种DP的变体,记得这个初始化!
*/
; i<=N; i++){
; j<=M; j++){
dp[i][j] = max(dp[i][j], dp[i-][j-] + cost[mp[str1[i]]][mp[str2[j]]]);
dp[i][j] = max(dp[i][j], dp[i-][j] + cost[mp[str1[i]]][]);
dp[i][j] = max(dp[i][j], dp[i][j-] + cost[][mp[str2[j]]]);
}
}
// for(int i=1; i<=N; i++){
// for(int j=1; j<=M; j++){
// printf("%d ", dp[i][j]);
// }puts("");
// }
return !printf("%d\n", dp[N][M]);;
}
洛谷 P1140 相似基因 ( 线性DP || 类LCS )的更多相关文章
- 洛谷P1140 相似基因 (DP)
洛谷P1140 相似基因 题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了44种核苷酸,简记作A,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. ...
- 洛谷P1140 相似基因(线性DP)
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了444种核苷酸,简记作A,C,G,TA,C,G,TA,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类 ...
- 2018.08.16 洛谷P2029 跳舞(线性dp)
传送门 简单的线性dp" role="presentation" style="position: relative;">dpdp. 直接推一推 ...
- 洛谷P1140 相似基因【线性dp】
题目:https://www.luogu.org/problemnew/show/P1140 题意: 给定两串基因串(只包含ATCG),在其中插入任意个‘-’使得他们匹配.(所以一共是5种字符) 这5 ...
- 洛谷 P1140 相似基因(DP)
传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 参考资料: [1]:https://www.cnblogs.com/real-l/p/9 ...
- 2018.11.04 洛谷P2679 子串(线性dp)
传送门 为什么前几年的noipnoipnoip总是出这种送分题啊? 这个直接线性dpdpdp不就完了吗? f[i][j][k][0/1]f[i][j][k][0/1]f[i][j][k][0/1]表示 ...
- 洛谷P1140 相似基因
题目:https://www.luogu.org/problemnew/show/P1140 分析: 本题一看就知道是一道动归,其实和字串距离非常的像,只不过多了题目规定的匹配相似度罢了. 匹配的相似 ...
- 洛谷 P1140 相似基因 题解
每日一题 day23 打卡 Analysis dp[i][j]表示序列A中前i个与序列B中前j个匹配的相似度最大值 所以,dp方程很容易想到: 1.让a[i]与b[j]匹配 2.让a[i]与B序列中一 ...
- 洛谷P1052 过河【线性dp】【离散化】
题目:https://www.luogu.org/problemnew/show/P1052 题意: 青蛙要从0跳到超过$l$的地方,每一次可以跳$s$到$t$之间的任意数. 在河中有m个石头,要求在 ...
随机推荐
- navicat连接 mysql报错1251解决方案
转自:https://blog.csdn.net/XDMFC/article/details/80263215 好不容易安装好mysql,但又出现了mysql客户端版本太低的问题.根据参考的这篇博客, ...
- Linux小技巧:du -sh * —— 查询文件目录大小
du -ach * #这个能看到当前目录下的所有文件占用磁盘大小和总大小 du -sh #查看当前目录总大小 du -sh * #查看所有子目录大小 du -sh ./* #查看当前目录下所有文件/文 ...
- java.time包常用类API学习记录
Java8出来已那么多年了,java.time包之前一直没有使用过,最近正好有用到,在此做个记录. 上图列出了java.time包下的类,接下来我们详细看下其中每个类的用法. Clock:获取到当前时 ...
- 【转】mysql索引的探究
转自:https://mp.weixin.qq.com/s/XTu7jERv3A0CIAzlECFnlA 相信很多人对于MySQL的索引都不陌生,索引(Index)是帮助MySQL高效获取数据的数据结 ...
- CentOS7之ssh-Xshell密钥认证登陆
操作系统版本:CentOS Linux release 7.2.1511 (Core) SSH版本:OpenSSH_6.6.1p1, OpenSSL 1.0.1e-fips 1.打开Xshell工 ...
- [luogu 3175] [HAOI2015]按位或(min-max容斥+高维前缀和)
[luogu 3175] [HAOI2015]按位或 题面 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行按位或运算.问期望多少秒后,你手上的数字变成2^n ...
- List<HashMap<String,String>> list, 根据hashmap中的某个键的值排序
来源https://blog.51cto.com/zhaodan/1725249 //可以使用Collections.sort(List list, Comparator c)来实现 这里举例hash ...
- mysql联合索引如何创建
例如: CREATE TABLE `test` ('aaa' varchar(16) NOT NULL default '', 'bbb' varchar(16) NOT NULL default ' ...
- MySQL数据表操作命令
mysql语句: 1.修改表名: rename table 旧表名 to 新表名; 2.修改字段类型: alter table 表名 modify column 字段名 字段类型(长度) 3.修改字段 ...
- 自动内存管理机制之java内存区域与内存溢出异常
一.运行时数据区域 java虚拟机所管理的内存会包括下面的几个部分: 1.程序计数器:是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器.一般情况下,字节码解释器工作的时候就是通过改变 ...