POJ 3691 AcWing 1053 修复DNA
题解:
这题的做法为AC自动机和动态规划。
具体来说,我们先将不允许出现的短串建AC自动机,在每个串末尾打一个标记(注意:在当nxt[p]nxt[p]nxt[p],被打标记后,p上也要打标记,因为从根到nxt[p]所组成的字符串是从根到p所组成的字符串的后缀)
我们设置dp[i][j]dp[i][j]dp[i][j]表示处理(修改或不修改)长串的前i个字符,匹配到AC自动机中的j号节点的方案中修改字符数量的最小值为多少(也就是从根到j所组成的字符串为长串前i个字符所组成的字符串的后缀)。(不能匹配到打过标记的点)
代码如下:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 1005;
const int INF = (1 << 30);
int tr[N][4], q[N], idx;
int nxt[N], tag[N], dp[N][N];
char str[25];
char s[N];
int get(char c){if(c == 'A') return 0;if(c == 'G') return 1;if(c == 'C') return 2;if(c == 'T') return 3;
}
void insert(){int p = 0, len = strlen(str), i, t;for(i = 0; i < len; i++){t = get(str[i]);if(tr[p][t] == 0)tr[p][t] = ++idx;p = tr[p][t];}tag[p] = 1;
}
void build(){int head = 1, tail = 1, i, t;for(i = 0; i < 4; i++)if(tr[0][i]) q[tail++] = tr[0][i];while(head < tail){t = q[head];head++;for(i = 0; i < 4; i++){if(tr[t][i] == 0) tr[t][i] = tr[nxt[t]][i];else {nxt[tr[t][i]] = tr[nxt[t]][i];q[tail++] = tr[t][i];tag[tr[t][i]] |= tag[nxt[tr[t][i]]];}}}
}
int main(){int T = 0, n, m;int i, j, k, p, ans;while(1){T++;idx = 0;memset(tr, 0, sizeof(tr));memset(nxt, 0, sizeof(nxt));memset(tag, 0, sizeof(tag));scanf("%d", &n);if(n == 0) break; for(i = 1; i <= n; i++){scanf("%s", str);insert();}build();scanf("%s", s + 1); m = strlen(s + 1); memset(dp, 120, sizeof(dp));dp[0][0] = 0;for(i = 0; i < m; i++){for(j = 0; j < idx; j++){for(k = 0; k < 4; k++){p = tr[j][k];if(tag[p] == 0) dp[i + 1][p] = min(dp[i + 1][p], dp[i][j] + (k != get(s[i + 1]))); }}}ans = INF;for(j = 0; j < idx; j++) ans = min(ans, dp[m][j]);if(ans == INF) ans = -1;printf("Case %d: %d\n", T, ans);}return 0;
}
POJ 3691 AcWing 1053 修复DNA相关推荐
- POJ 3691 DNA repair AC自动机 + DP
题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道 dp[i][j] 为文本串到 第i ...
- 使用3D-DNA流程,结果不升反降怎么破?
之前我写过一篇利用3D-DNA流程基于Hi-C提升基因组组装,那个时候我做的项目并不多,也没有遇到坑,直到最近我用3D-DNA流程进行基因组组装,发现结果出乎意料 Fig1 在上图中,蓝色框表示组装出 ...
- DP 状态机模型 AcWing算法提高课 详解
状态机模型 AcWing 1049. 大盗阿福 #include <iostream> #include <algorithm> #include <cmath> ...
- 算法——AcWing算法提高课中代码和题解
文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...
- AcWing算法提高课
1. 动态规划(43/68) 1.1 数字三角形模型(4/4) 1.1.1 AcWing 1015. 摘花生 结论: f[i][j]=max(f[i−1][j],f[i][j−1])+w[i][j] ...
- 【动态规划】状态机模型
整理的算法模板合集: ACM模板 文章目录 A.抛砖引玉 - AcWing 1049. 大盗阿福 B.AcWing 1057. 股票买卖 IV C.AcWing 1058. 股票买卖 V D.AcWi ...
- acwing提高组 第一章 动态规划
文章目录 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP oj链接 数字三角形模型 AcWing 1015. 摘花 ...
- AcWing-算法提高课【合集】
算法提高 动态规划 数字三角形 1015. 摘花生 1018.最低通行费 1027. 方格取数 最长上升子序列LIS 1017. 怪盗基德的滑翔翼 1014.登山 482.合唱队形 1012. 友好城 ...
- 分子生物学 第五章 DNA损伤修复和突变
文章目录 第五章 DNA损伤修复和突变 第一节 第二节 DNA损伤的类型 1 造成DNA损伤的因素 2 DNA损伤的类型 3 DNA损伤修复机制 3.1 直接修复 3.2 切除修复 3.3 双链断裂修 ...
最新文章
- NEON在Android中的使用举例
- cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环amp;主角加入动作
- (网页的缓存控制)HTML配置no-cache(备忘) “Cache-control”常见的取值
- chrome浏览器调试手机端h5页面
- SQL Server Guid和NEWSEQUENTIALID函数
- python实现数据库事务回滚_使用Python脚本实现MySQL误操作的快速回滚
- java j2se1.5_用J2SE1.5建立多任务的Java应用程序...
- 2020-12-15 CPU设计复盘
- 实现分页的通用存储过程
- last_inner = inner_lateral + inner_top_down RuntimeError: The size of tensor a (81) must match the s
- coreos 安装 mysql_在 UOS 上体验 CoreOS
- java为纯图PDF添加图片水印
- 苹果笔记本电脑我的计算机在哪里设置密码,Mac小教程:设置苹果Mac电脑的开机密码...
- java 渗透_渗透课程笔记
- 关于 PoW 和 PoS
- 数据分析项目-合集-day02
- 我的游戏学习日志10——数字游戏策划(5)游戏策划的概念与分工
- Java使用poi和jfreechart生成excel图表图片
- 计算机毕业设计Java普通中学体育卫生信息管理系统(源码+系统+mysql数据库+lw文档)
- EOS账户如何工作,我们怎样获得EOS账户?