【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 ...
随机推荐
- centOS安装网卡驱动
作为一个小白来说,安装驱动之类的真是无心下手的感觉,在学习了http://www.centoscn.com/image-text/config/2013/0816/1269.html这篇帖子的步骤之后 ...
- C——第一阶段结束
C primier 刚好是八月末了,原计划到月中结束的.由于工作上的许多事,忙着学习,测试等.C primier与这周末彻底结束了.加上之前的基础,算是把C又全部重新学习了一遍. 在Linux环境下, ...
- unity中的WWW通讯问题
网上很多写到WWW的问题. 一.局限性比较大,使用不方便二.WWW类的使用不符合微软的命名规范三.在大量并发使用WWW类会发生"Too Many Threads"的异常 确实有些, ...
- maven多项目配置实践
工具:IntelliJ IDEA 1.新建maven项目top 略 提示:不使用任何模版 2.在上面的maven项目的目录下(虽然这不一定是必须的),新建另一个maven项目secend. 同上 3. ...
- CentOS linux下安装和配置Apache+SVN(用浏览器http方式访问SVN目录)
在CentOS linux下安装SVN,我们可以进行以下步骤: 第一步:安装CentOS Linux操作系统,并在CentOS安装进行的同时,自定义安装这一步,一定要勾选Subversion(在“开发 ...
- ASP.NET 服务器控件的生命周期
服务器控件生命周期简介 服务器控件的生命周期是创建服务器控件最重要的概念.作为开发人员,必须对服务器控件生命周期深刻理解.当然,这不是一朝一夕就可以做到的.对于学习控件开发技术的初学者,可以不必掌握得 ...
- C语言获得文件一行
C语言获得一行的数据还是比较麻烦的,这里讲一下几种曾经用过的方法. 第一种,是最笨的方法,就是一个一个字符的读取,也是最容易想到的方法.具体实现如下:void read_line(char l ...
- SDRAM控制器的Verilog建模之一
前言:作为经典存储器的三剑客中的flash和sram已经建模测试过了,虽然现在都已经ddr2,ddr3,667MHZ.1333MHZ的天下了,但是接下这周来准备写一下sdram的controller. ...
- 安装MySQL5.7
安装方式:绿色安装(使用压缩文件) 文件版本:MySQL Community Server 5.7.13(x86 &x64) 大部分过程同<安装MySQL5.5>,本篇只写不同部分 ...
- linux svn 提交文件时强制填写备注
很多程序员不爱写注释,特别是svn提交的时候,文件做了什么修改都没有一个简单的备注,往往都是直接提交,这样是非常不利于团队开发的.所以就有了svn提交的时候,强制修改文件的备注. 步骤如下: 1.先找 ...