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 ...
随机推荐
- Windown安装Mysql安装图解
一.MYSQL的安装 1.打开下载的mysql安装文件mysql-5.0.27-win32.zip,双击解压缩,运行“setup.exe”. 2.选择安装类型,有“Typical(默认)”.“Comp ...
- Eclipse扩展点实践之添加快捷菜单项(Command方式实现)
有两种方式,一种是Action的方式,另一种是Command的方式(这两种方式的区别详见:http://wiki.eclipse.org/FAQ_What_is_the_difference_betw ...
- 存储管理(一):openfiler介绍及存储理解
openfiler是一个免费的.开源的基于浏览器的网络存储产品,支持基于文件的的网络连接存储(NAS)和基于块的存储区域网(SAN).支持的协议有smb,cifs,nfs,http/dev和ftp. ...
- pygame系列_draw游戏画图
说到画图,pygame提供了一些很有用的方法进行draw画图. ''' pygame.draw.rect - draw a rectangle shape draw a rectangle shape ...
- 用python调用R做数据分析-准备工作
0.R的介绍 R是自由软件,不带不论什么担保.在某些条件下你能够将其自由散布,用'license()'或'licence()'来看散布的具体条件. R是个合作计划.有很多人为之做出了贡献,用'cont ...
- registerWithTouchDispatcher()函数的使用
registerWithTouchDispatcher()函数的使用 registerWithTouchDispatcher()函数主要用于注册Touch事件. 当我们使用this->setTo ...
- hdu4734(数位dp)
hdu4734 给定 a和b, 问区间[0,b]内有多少个数字的f(i) <=f(a) dp[i][s] 表示i位的数字的f<=s 所以比如如果第i+1位选择数字5之后, 那么只要剩下的i ...
- 【Android】应用启动画面
几乎所有的Android应用程序都会有一个启动画面,展示自己的LOGO,本版信息,或者更人性化一点的,在很长的加载信息中,变换一些显示的文字等,让无聊的等待时间添加点调味剂. 具体实现来说,应该创建一 ...
- Android中目的地Intent的使用
一.什么是Intent? Intent的中文意思是目的.在Android中也是“目的”的意思.就是我们要去哪里,从这个activity要前往另一个Activity就需要用到Intent. 示例代码一: ...
- altKey,ctrlKey,shiftKey
<1> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title>< ...