Match:DNA repair(POJ 3691)
题目大意:给定一些坏串,再给你一个字符串,要你修复这个字符串(AGTC随便换),使之不含任何坏串,求修复所需要的最小步数。
这一题也是和之前的那个1625的思想是一样的,通过特殊的trie树找到所有的状态然后一个一个枚,具体状态转移的思想可以在1625那里看
当然了这一题不是像1625那样求总的组合数,这一题也是DP,求的是最小值,那么我们也是一样,统计从合法状态中转移到任何一个状态最小值即可。
状态转移方程dp[i+1][转移状态]=min(dp[i+1][转移状态],dp[i][当前状态]+s)(当转移状态对应的就是trie的节点,当节点对应的字符等于字符串当前位置的字符,则s为0,否则s为1。)
- #include <iostream>
- #include <algorithm>
- #include <functional>
- #include <string.h>
- #define MAX 1010
- using namespace std;
- struct node
- {
- int Num, If_End;
- struct node *Fail, *Next[];
- }*root, Mem_Pool[MAX], *Queue[ * MAX];
- static int sum_node, Hash_Table[], dp[MAX][MAX];
- static char str[MAX], DNA[] = { 'A', 'G', 'C', 'T' };
- struct node *create_new_node();
- int find_min(const int, const int);
- void put_DNA_into_hash(void);
- void insert(struct node *);
- void build_ac_automation(struct node *);
- int main(void)
- {
- int Disease_Segement_Sum, str_length, case_sum = ;
- put_DNA_into_hash();
- while (~scanf("%d", &Disease_Segement_Sum))
- {
- if (Disease_Segement_Sum == )
- break;
- sum_node = ;
- node *root = create_new_node();
- getchar();
- for (int i = ; i < Disease_Segement_Sum; i++)
- insert(root);
- build_ac_automation(root);
- gets(str);
- str_length = strlen(str);
- for (int i = ; i < str_length; i++)
- {
- fill(dp[i + ], dp[i + ] + sum_node, MAX + );
- for (int j = ; j < sum_node; j++)
- {
- if (Mem_Pool[j].If_End)
- continue;
- for (int k = ; k < ; k++)
- {
- int id = Mem_Pool[j].Next[k]->Num;
- if (Mem_Pool[j].Next[k]->If_End)
- continue;
- else if (Hash_Table[str[i]] == k)
- dp[i + ][id] = find_min(dp[i + ][id], dp[i][j]);
- else
- dp[i + ][id] = find_min(dp[i + ][id], dp[i][j] + );
- }
- }
- }
- int ans = MAX + ;
- for (int i = ; i < sum_node; i++)
- ans = find_min(ans, dp[str_length][i]);
- if (ans != MAX + )
- printf("Case %d: %d\n", case_sum++, ans);
- else
- printf("Case %d: -1\n",case_sum++);
- }
- return EXIT_SUCCESS;
- }
- int find_min(const int x, const int y)
- {
- return x < y ? x : y;
- }
- struct node *create_new_node(void)
- {
- node *tmp = &Mem_Pool[sum_node];
- tmp->Fail = NULL;
- tmp->If_End = ;
- memset(tmp->Next, , sizeof(struct node *) * );
- tmp->Num = sum_node++;
- return tmp;
- }
- void put_DNA_into_hash(void)
- {
- for (int i = ; i<; i++)
- Hash_Table[DNA[i]] = i;
- }
- void insert(struct node *root)
- {
- node *ptr = root;
- gets(str);
- for (int i = ; str[i] != '\0'; i++)
- {
- int id = Hash_Table[str[i]];
- if (ptr->Next[id] == NULL)
- ptr->Next[id] = create_new_node();
- ptr = ptr->Next[id];
- }
- ptr->If_End = ;
- }
- void build_ac_automation(struct node *root)
- {
- int head = , tail = ;
- root->Fail = NULL;
- Queue[tail++] = root;
- while (head != tail)
- {
- node *out = Queue[head++];
- for (int i = ; i < ; i++)
- {
- if (out->Next[i] != NULL)
- {
- if (out == root)
- out->Next[i]->Fail = root;
- else
- {
- out->Next[i]->Fail = out->Fail->Next[i];
- if (out->Fail->Next[i]->If_End)
- out->Next[i]->If_End = ;
- }
- Queue[tail++] = out->Next[i];
- }
- else if (out == root)
- out->Next[i] = root;
- else
- out->Next[i] = out->Fail->Next[i];
- }
- }
- }
Match:DNA repair(POJ 3691)的更多相关文章
- POJ 3691 & HDU 2457 DNA repair (AC自己主动机,DP)
http://poj.org/problem?id=3691 http://acm.hdu.edu.cn/showproblem.php?pid=2457 DNA repair Time Limit: ...
- POJ 3691 DNA repair (DP+AC自动机)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4815 Accepted: 2237 Descri ...
- poj 3691 DNA repair(AC自己主动机+dp)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5877 Accepted: 2760 Descri ...
- HDU 2457/POJ 3691 DNA repair AC自动机+DP
DNA repair Problem Description Biologists finally invent techniques of repairing DNA that contains ...
- HDU 2457 DNA repair(AC自动机+DP)题解
题意:给你几个模式串,问你主串最少改几个字符能够使主串不包含模式串 思路:从昨天中午开始研究,研究到现在终于看懂了.既然是多模匹配,我们是要用到AC自动机的.我们把主串放到AC自动机上跑,并保证不出现 ...
- hdu2457:DNA repair
AC自动机+dp.问改变多少个字符能让目标串不含病毒串.即走过多少步不经过病毒串终点.又是同样的问题. #include<cstdio> #include<cstring> # ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 【POJ3691】 DNA repair (AC自动机+DP)
DNA repair Time Limit: 2000MS Memory Limit: 65536KB 64bit IO Format: %I64d & %I64u Description B ...
- HDU2457 DNA repair —— AC自动机 + DP
题目链接:https://vjudge.net/problem/HDU-2457 DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory ...
随机推荐
- 导航菜单:jQuery粘性滚动导航栏效果
粘性滚动是当导航在滚动过程中会占粘于浏览器上,达到方便网站页面浏览的效果,也是一种用户体验,下面我们看一下是怎么实现的: jQuery的 smint插件,也是一个导航菜单固定插件.当页滚动时,导航菜单 ...
- Windows Server 2008 R2 IIS7.5下PHP、MySQL快速环境配置【图】
众所周知,win平台的服务器版本默认是不能运行php的,需要对服务器进行环境配置. 而许多朋友纠结如何配置,在百度上搜索出的教程一大堆,基本步骤复杂,新手配置容易出错. 今天,邹颖峥教大家一种快速配置 ...
- hibernate中get,load,list,iterate的用法及比较
首先,get和load都是查询单个对象,而list和iterate为批量查询 注意以下写法仅针对hibernate3的语法. 使用案例如下: // 1. get和load 的用法 Person p = ...
- 全键盘Vimium快捷键学习记录
0.设置而 vimium 的默认搜索引擎: http://www.baidu.com/s?wd= j: 向下细微滚动窗口. k:向上细微滚动窗口. gg:跳转到页面的顶部.G:跳转到页面的底部.r: ...
- 原生态js获取节点的方法
<input value="我是用id来获取值的" type="button" onclick="GetById()"/> &l ...
- 跟着百度学PHP[4]OOP面对对象编程-6-封装性private
所谓封装顾名思义,如同箱子般给封装起来.结合前面的来说就是对属性或者方法,封装后的方法或属性只能有类内部进行调用.外部调用不了. 封装性的好处: 1.信息隐藏 2.http://www.cnblogs ...
- TP中的四种url访问方式
什么是PATHINFO:就是http://localhost/index.php/Home/Index/index/a/1/b/2?c=3中的红色部分, 注意c=3并不是pathinfo的一部分,它是 ...
- am335x 电容屏驱动添加。
参考:http://www.cnblogs.com/helloworldtoyou/p/5530422.html 上面可以下载驱动. 解压后驱动有如下目录: 我们要选择的是: eGTouchARM/e ...
- BZOJ 2448: 挖油
Description [0,x]中全是1,其余全是0,每个点有一个权值,求最坏情况下得到x的最小权值. Sol DP+单调队列. 首先就是一个 \(O(n^3)\) 的DP. \(f[i][j]\) ...
- BZOJ 2084: [Poi2010]Antisymmetry
Sol Manacher. \(O(n)\) Manacher很简单啊.改一改转移就可以了. 然后我WA了.一开始天真的认为id只会是奇数,然后就GG. 一组 Hack 数据 3 1 0 0 然后就跳 ...