【POJ3691】DNA repair(AC自动机,DP)
题意:
生物课上我们学到,DNA序列中只有A, C, T和G四种片段。
经科学发现,DNA序列中,包含某些片段会产生不好的基因,如片段”ATC”是不好片段,则”AGATCC”, “CATCAA”, “ATCATC”都是不好的DNA序列,这些不好片段我们可以称为病毒片段。
现在已知m个病毒片段, 然后给定一个DNA串,问如果使用最少的修改(将DNA中的某个字母,变为其他字母,比如A变T,但变的字母也只能是”ACTG”),使得这个DNA串不包含病毒片段。
【数据规模和约定】
1<=m<=50 病毒片段长度不超过20,只含A,T,C,G字母
DNA串长度不超过1000, 只含A, T, C, G字母
思路:AC自动机上的DP
判断是否病毒部分与上一道相同
设dp[i,j]为在原串上前i个字母上改,现在在自动机上j号节点的最小值
\[ dp[i,x]=min\begin{cases} dp[i-1,j] (k=ch[i])\\dp[i-1,j]+1 (k<>ch[i])\end{cases} \]
其中x为j号节点走字母k之后所到达的节点号,要求j号节点为合法节点
答案即为\[ min(dp[len,i]) (i为合法节点) \]
const s:array[..]of char=('A','C','G','T');
oo=;
var map:array[..,'A'..'T']of longint;
dp:array[..,..]of longint;
b,f:array[..]of longint;
q:array[..]of longint;
n,tot,i,j,k,d,ans,num,p,cas:longint;
ch:ansistring;
procedure build;
var i,d,u:longint;
begin
u:=; d:=length(ch);
for i:= to d do
begin
if map[u,ch[i]]= then begin inc(num); map[u,ch[i]]:=num; end;
u:=map[u,ch[i]];
end;
b[u]:=;
end;
procedure acauto;
var t,w,u,p,son,i:longint;
begin
t:=; w:=; q[]:=;
while t<w do
begin
inc(t); u:=q[t];
if b[f[u]]= then b[u]:=;
for i:= to do
if map[u,s[i]]> then
begin
son:=map[u,s[i]];
p:=f[u];
if u= then f[son]:=
else f[son]:=map[p,s[i]];
inc(w); q[w]:=son;
end
else
begin
p:=f[u];
if u= then map[u,s[i]]:=
else map[u,s[i]]:=map[p,s[i]];
end;
end;
end;
function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end;
begin
assign(input,'poj3691.in'); reset(input);
assign(output,'poj3691.out'); rewrite(output);
while not eof do
begin
fillchar(f,sizeof(f),);
fillchar(b,sizeof(b),);
fillchar(dp,sizeof(dp),$1f);
for i:= to num do
for j:= to do map[i,s[j]]:=;
readln(n);
if n= then break;
num:=; inc(cas);
for i:= to n do
begin
readln(ch);
build;
end;
acauto;
readln(ch);
dp[,]:=; d:=length(ch);
for i:= to d do
for j:= to num do
if (b[j]=)and(dp[i-,j]<oo) then
for k:= to do
begin
p:=map[j,s[k]];
if b[p]= then
begin
if ch[i]=s[k] then dp[i,p]:=min(dp[i,p],dp[i-,j])
else dp[i,p]:=min(dp[i,p],dp[i-,j]+);
end;
end;
ans:=oo;
for i:= to num do
if b[i]= then ans:=min(ans,dp[d,i]);
write('Case ',cas,': ');
if ans<oo then writeln(ans)
else writeln(-);
end;
close(input);
close(output);
end.
【POJ3691】DNA repair(AC自动机,DP)的更多相关文章
- POJ3691 DNA repair(AC自动机 DP)
给定N个长度不超过20的模式串,再给定一个长度为M的目标串S,求在目标串S上最少改变多少字符,可以使得它不包含任何的模式串 建立Trie图,求得每个节点是否是不可被包含的串,然后进行DP dp[i][ ...
- HDU2457 DNA repair —— AC自动机 + DP
题目链接:https://vjudge.net/problem/HDU-2457 DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory ...
- HDU 2457/POJ 3691 DNA repair AC自动机+DP
DNA repair Problem Description Biologists finally invent techniques of repairing DNA that contains ...
- [hdu2457]DNA repair(AC自动机+dp)
题意:给出一些不合法的模式DNA串,给出一个原串,问最少需要修改多少个字符,使得原串中不包含非法串. 解题关键:多模式串匹配->AC自动机,求最优值->dp,注意在AC自动机上dp的套路. ...
- POJ 3691 DNA repair(AC自动机+DP)
题目链接 能AC还是很开心的...此题没有POJ2778那么难,那个题还需要矩阵乘法,两个题有点相似的. 做题之前,把2778代码重新看了一下,回忆一下当时做题的思路,回忆AC自动机是干嘛的... 状 ...
- HDU 2457 DNA repair (AC自动机+DP)
题意:给N个串,一个大串,要求在最小的改变代价下,得到一个不含上述n个串的大串. 思路:dp,f[i][j]代表大串中第i位,AC自动机上第j位的最小代价. #include<algorithm ...
- hdu_2457_DNA repair(AC自动机+DP)
题目连接:hdu_2457_DNA repair 题意: 给你N个字符串,最后再给你一个要匹配的串,问你最少修改多少次,使得这个串不出现之前给的N的字符串 题解: 刚学AC自动机,切这题还真不知道怎么 ...
- poj 2778 DNA Sequence AC自动机DP 矩阵优化
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11860 Accepted: 4527 Des ...
- POJ 2778 DNA Sequence (AC自动机+DP+矩阵)
题意:给定一些串,然后让你构造出一个长度为 m 的串,并且不包含以上串,问你有多少个. 析:很明显,如果 m 小的话 ,直接可以用DP来解决,但是 m 太大了,我们可以认为是在AC自动机图中,根据离散 ...
- HDU 2425 DNA repair (AC自动机+DP)
DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- 验证码javaweb
package cn.itcast.utils; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; impo ...
- UIViewContentMode各类型效果
UIViewContentMode typedef enum { UIViewContentModeScaleToFill, UIViewContentModeScaleAspectF ...
- oracle 单列索引 多列索引的性能测试
清除oralce 缓存:alter system flush buffer_cache; 环境:oracle 10g . 400万条数据,频率5分钟一条 1.应用场景: 找出所有站点的最新一条数据. ...
- 安装完Pydev却无法创建Python工程
为了方便以后工作,今天在ADT里面安装了Pydev(http://pydev.org/updates),可是安装完之后,新建项目的时候却找不到Pydev,perference中也没有. 紧接着尝试安装 ...
- jsonp与JAVA的配合使用
一.客户端 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w ...
- PHP命名空间的作用、为什么使用命名空间?
命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误.这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀. 举个栗子:项目中 ...
- .html()和.text()的区别
在页面调用接口显示数据的时候,正常情况下.html()和.text()都可以显示数据内容,但是在特殊情况下,比如接口中这个参数为空的时候就表现出差距了,.html()显示的是空白,而.text()显示 ...
- AX7: Quick and easy debugging
This purpose of this blog is to show how you can get quickly get started with debuggingin AX7, speci ...
- LR12.53—第3课:重播Vuser脚本
第3课:重播Vuser脚本 在前面的教训,你记录了一组典型的用户行为,并准备重播脚本. 重播脚本之前,您可以配置脚本的运行时设置,它定义了Vuser的行为. 注:记录与基于Web的协议的地方WebTo ...
- .net网站能走多远
刚写好了学校网站,请大家帮忙测试一下.不知道怎么sql注入,或者DDoS攻击,我也是大四什么都是摸索阶段,不过这个网站 做了好长时间了,现在终于可以上架了,希望大家能指点一二,谢谢! 地址:http: ...