POJ 3691 DNA repair 基于AC自己主动机DP
dp[i][j] 它表示的长度 i 下游前缀 j 更改节点的最小数量。
很清楚dp[0][0] = 0;
dp[ i ][ j ] = min(dp[ i ][ j ],dp[i-1][k] + (j == k ?
0 : 1)),当且仅当j。k满足下列条件时。
j 不为某条模式串的末节点 且 j 到 root 的由失败指针组成的路径上无末节点。
j 是k的儿子节点 或者 j 的父节点可由 k 沿着失败指针找到。
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <cstdlib>
- #include <cstdio>
- #include <queue>
- #include <cmath>
- #include <stack>
- #include <map>
- #pragma comment(linker, "/STACK:1024000000");
- #define EPS (1e-8)
- #define LL long long
- #define ULL unsigned long long
- #define _LL __int64
- #define INF 0x3f3f3f3f
- using namespace std;
- const int MAXN = 4;
- struct N
- {
- int next[MAXN],flag,fail;
- } st[1010];
- int Top;
- int sel(char c)
- {
- if(c == 'A')
- return 0;
- if(c == 'G')
- return 1;
- if(c == 'C')
- return 2;
- return 3;
- }
- int creat()
- {
- memset(st[Top].next,-1,sizeof(st[Top].next));
- st[Top].fail = -1,st[Top].flag = 0;
- return Top++;
- }
- int dp[1010][1010];
- char s[1010];
- void Get_Trie(int root,char *s)
- {
- int site = 1;
- while(s[site] != '\0')
- {
- if(st[root].next[sel(s[site])] == -1)
- st[root].next[sel(s[site])] = creat();
- root = st[root].next[sel(s[site])];
- ++site;
- }
- st[root].flag = 1;
- }
- int Get_Fail(int site,int tar)
- {
- while(site != -1 && st[site].next[tar] == -1)
- site = st[site].fail;
- if(site == -1)
- return 0;
- return st[site].next[tar];
- }
- queue<int> q;
- void Get_Fail(int root)
- {
- q.push(root);
- st[root].fail = -1;
- int f;
- while(q.empty() == false)
- {
- f = q.front();
- q.pop();
- for(int i = 0; i < MAXN; ++i)
- {
- if(st[f].next[i] != -1)
- {
- st[st[f].next[i]].fail = Get_Fail(st[f].fail,i);
- q.push(st[f].next[i]);
- }
- }
- }
- }
- bool Is_Safe(int site)
- {
- if(site == -1)
- return true;
- if(st[site].flag || Is_Safe(st[site].fail) == false)
- return false;
- return true;
- }
- int Is_Safe(int site,int tar)
- {
- if(site == -1)
- return 0;
- if(st[site].next[tar] != -1)
- {
- if(st[st[site].next[tar]].flag != 0 || Is_Safe(st[site].next[tar]) == false)
- return -1;
- return st[site].next[tar];
- }
- return Is_Safe(st[site].fail,tar);
- }
- void Match(int root,char *s)
- {
- memset(dp,INF,sizeof(dp));
- dp[0][0] = 0;
- int site,i,j,tmp;
- for(site = 1; s[site] != '\0'; ++site)
- {
- for(i = 0; i < Top; ++i)
- {
- if(dp[site-1][i] == INF)
- continue;
- for(j = 0; j < 4; ++j)
- {
- if(st[i].next[j] != -1 && st[st[i].next[j]].flag != 0)
- continue;
- if(st[i].next[j] != -1 && Is_Safe(st[i].next[j]))
- {
- dp[site][st[i].next[j]] = min(dp[site][st[i].next[j]],dp[site-1][i] + (j == sel(s[site]) ? 0 : 1));
- continue;
- }
- tmp = Is_Safe(i,j);
- if(tmp == -1)
- continue;
- dp[site][tmp] = min(dp[site][tmp],dp[site-1][i] + (j == sel(s[site]) ? 0 : 1));
- }
- }
- }
- }
- int main()
- {
- int i,n;
- int icase = 1;
- int root;
- while(scanf("%d",&n) && n)
- {
- Top = 0;
- root = creat();
- for(int i = 1; i <= n; ++i)
- {
- scanf("%s",s+1);
- Get_Trie(root,s);
- }
- Get_Fail(root);
- scanf("%s",s+1);
- Match(root,s);
- int anw = INF,len = strlen(s+1);
- for(i = 0; i < Top; ++i)
- anw = min(anw,dp[len][i]);
- printf("Case %d: %d\n",icase++,anw == INF ? -1 : anw);
- }
- return 0;
- }
版权声明:本文博客原创文章,博客,未经同意,不得转载。
POJ 3691 DNA repair 基于AC自己主动机DP的更多相关文章
- poj 3691 DNA repair(AC自己主动机+dp)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5877 Accepted: 2760 Descri ...
- POJ 2778 DNA Sequence (AC自己主动机 + dp)
DNA Sequence 题意:DNA的序列由ACTG四个字母组成,如今给定m个不可行的序列.问随机构成的长度为n的序列中.有多少种序列是可行的(仅仅要包括一个不可行序列便不可行).个数非常大.对10 ...
- Hdu 3341 Lost's revenge (ac+自己主动机dp+hash)
标题效果: 举个很多种DNA弦,每个字符串值值至1.最后,一个长字符串.要安排你最后一次另一个字符串,使其没事子值和最大. IDEAS: 首先easy我们的想法是想搜索的!管她3721..直接一个字符 ...
- HDU - 2825 Wireless Password(AC自己主动机+DP)
Description Liyuan lives in a old apartment. One day, he suddenly found that there was a wireless ne ...
- hdu4758 Walk Through Squares (AC自己主动机+DP)
Walk Through Squares Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others ...
- hdu4057 Rescue the Rabbit(AC自己主动机+DP)
Rescue the Rabbit Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU - 4758 Walk Through Squares (AC自己主动机+DP)
Description On the beaming day of 60th anniversary of NJUST, as a military college which was Secon ...
- POJ 3691 DNA repair (DP+AC自动机)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4815 Accepted: 2237 Descri ...
- HDU 2457/POJ 3691 DNA repair AC自动机+DP
DNA repair Problem Description Biologists finally invent techniques of repairing DNA that contains ...
随机推荐
- Net分布式系统
Net分布式系统 Net分布式系统之三:Keepalived+LVS+Nginx负载均衡之高可用 摘要: 上一篇写了nginx负载均衡,此篇实现高可用(HA).系统整体设计是采用Nginx做负载均衡, ...
- A Game of Thrones(2) - Catelyn
Catelyn had never liked this godswood(神木林). She had been born a Tully, at Riverrun far to the south, ...
- Effective C++:条款28:避免返回 handles 指向对象内部成员
(一) 有时候为了让一个对象尽量小,能够把数据放在另外一个辅助的struct中,然后再让一个类去指向它.看以下的代码: class Point { public: Point(int x, int y ...
- android2.2应用开发之IccCard(sim卡或USIM卡)
tyle="margin:20px 0px 0px; font-size:14px; line-height:26px; font-family:Arial; color:rgb(51,51 ...
- Java中的反射——(1)什么是反射
Java程序中的各个Java类属于同一类事物,描写叙述这类事物的Java类名就是Class. public class ReflectTest { public static void main(St ...
- POJ 1002 487-3279 Trie解读
这个问题的解决方法是多种多样的.如本文所用,Trie为了解决这个问题. 它也可用于hash表.map等解决方案,由于输入是特定7数字,因此,你应该能够解决. 如本文所用,Trie不是非常快.最后,我主 ...
- Android 反编译(一,apktool+smail2java)
一:解压缩(获取图片等资源) 对于apk中丰富的资源,假设我们在练习的时候须要引用某些apk中的资源文件时,最简单的办法使用解压缩工具对apk进行解压缩,然后在对应的文件夹下查找须要的资源文件. 二: ...
- 玩转web之json(五)---将表单通过serialize()方法获取的值转成json
form表单有一个serialize()方法,可以序列化表单的值,但是jquery提供的这个方法会把数据序列化为类似下面的形式: a=1&b=2&c=3&d=4 jquery并 ...
- C/C++大型项目错误管理
在C/C++大型项目中,错误管理在项目中起着举足轻重的作用,以我自己的项目经验以及观摩其它项目,错误管理对项目框架以及开发效率有着非常大的影响.对于错误管理的认识大致分为三类: 刚刚開始敲代码的新手, ...
- response.setHeader各种使用方法
一秒刷新页面一次 response.setHeader("refresh","1"); 二秒跳到其它页面 response.setHeader("re ...