题解:

这题的做法为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相关推荐

  1. POJ 3691 DNA repair AC自动机 + DP

    题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道  dp[i][j] 为文本串到 第i ...

  2. 使用3D-DNA流程,结果不升反降怎么破?

    之前我写过一篇利用3D-DNA流程基于Hi-C提升基因组组装,那个时候我做的项目并不多,也没有遇到坑,直到最近我用3D-DNA流程进行基因组组装,发现结果出乎意料 Fig1 在上图中,蓝色框表示组装出 ...

  3. DP 状态机模型 AcWing算法提高课 详解

    状态机模型 AcWing 1049. 大盗阿福 #include <iostream> #include <algorithm> #include <cmath> ...

  4. 算法——AcWing算法提高课中代码和题解

    文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...

  5. 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] ...

  6. 【动态规划】状态机模型

    整理的算法模板合集: ACM模板 文章目录 A.抛砖引玉 - AcWing 1049. 大盗阿福 B.AcWing 1057. 股票买卖 IV C.AcWing 1058. 股票买卖 V D.AcWi ...

  7. acwing提高组 第一章 动态规划

    文章目录 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP oj链接 数字三角形模型 AcWing 1015. 摘花 ...

  8. AcWing-算法提高课【合集】

    算法提高 动态规划 数字三角形 1015. 摘花生 1018.最低通行费 1027. 方格取数 最长上升子序列LIS 1017. 怪盗基德的滑翔翼 1014.登山 482.合唱队形 1012. 友好城 ...

  9. 分子生物学 第五章 DNA损伤修复和突变

    文章目录 第五章 DNA损伤修复和突变 第一节 第二节 DNA损伤的类型 1 造成DNA损伤的因素 2 DNA损伤的类型 3 DNA损伤修复机制 3.1 直接修复 3.2 切除修复 3.3 双链断裂修 ...

最新文章

  1. NEON在Android中的使用举例
  2. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环amp;主角加入动作
  3. (网页的缓存控制)HTML配置no-cache(备忘) “Cache-control”常见的取值
  4. chrome浏览器调试手机端h5页面
  5. SQL Server Guid和NEWSEQUENTIALID函数
  6. python实现数据库事务回滚_使用Python脚本实现MySQL误操作的快速回滚
  7. java j2se1.5_用J2SE1.5建立多任务的Java应用程序...
  8. 2020-12-15 CPU设计复盘
  9. 实现分页的通用存储过程
  10. last_inner = inner_lateral + inner_top_down RuntimeError: The size of tensor a (81) must match the s
  11. coreos 安装 mysql_在 UOS 上体验 CoreOS
  12. java为纯图PDF添加图片水印
  13. 苹果笔记本电脑我的计算机在哪里设置密码,Mac小教程:设置苹果Mac电脑的开机密码...
  14. java 渗透_渗透课程笔记
  15. 关于 PoW 和 PoS
  16. 数据分析项目-合集-day02
  17. 我的游戏学习日志10——数字游戏策划(5)游戏策划的概念与分工
  18. Java使用poi和jfreechart生成excel图表图片
  19. 计算机毕业设计Java普通中学体育卫生信息管理系统(源码+系统+mysql数据库+lw文档)
  20. EOS账户如何工作,我们怎样获得EOS账户?

热门文章

  1. 端午节蓝屏之谜:金山系列软件同微软KB2839229冲突技术分析
  2. 一个机器人位于m x n网格的左上角达到网格的右下角,有多少条不同的路径?
  3. 云上数据保护,你以为挡住黑客就够了?
  4. 腾讯企业邮箱单点登录 php,腾讯企业邮箱集成的坑
  5. 量化投资:用Python实现金融数据的获取与整理
  6. 润迈德医疗开启招股:未有基石投资者参与,亏损金额翻倍增长
  7. 六、Audio-ALSA架构中的codec
  8. 树状数组讲解(简洁好懂)
  9. java 区位码转中文_Java根据汉字生成区位码公共类
  10. 小米8Lite刷机教程(大多数手机操作基本通用)