POJ 3691 DNA repair(AC自动机+DP)
能AC还是很开心的...此题没有POJ2778那么难,那个题还需要矩阵乘法,两个题有点相似的。
做题之前,把2778代码重新看了一下,回忆一下当时做题的思路,回忆AC自动机是干嘛的...
状态表示dp[i][j]长度为i的以j串为结束的最小改变数目。AC自动机预处理一下,然后DP。
卡内存+不知道状态数,MLE+RE+WA了多次。
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <queue>
- #include <algorithm>
- #include <cstdlib>
- using namespace std;
- #define N 2222222
- #define INF 10000000
- int trie[N][];
- int o[N];
- int que[N];
- int fail[N];
- int dp[][];
- int t;
- void CL()
- {
- memset(trie,-,sizeof(trie));
- memset(o,,sizeof(o));
- t = ;
- }
- int judge(char s)
- {
- switch(s)
- {
- case'A':return ;
- case'C':return ;
- case'G':return ;
- case'T':return ;
- }
- return ;
- }
- void insert(char *str)
- {
- int i,len,root;
- root = ;
- len = strlen(str);
- for(i = ;i < len;i ++)
- {
- if(trie[root][judge(str[i])] == -)
- trie[root][judge(str[i])] = t ++;
- root = trie[root][judge(str[i])];
- }
- o[root] = ;
- }
- void build_ac()
- {
- int head,tail,front,i;
- head = tail = ;
- for(i = ;i < ;i ++)
- {
- if(trie[][i] != -)
- {
- fail[trie[][i]] = ;
- que[tail++] = trie[][i];
- }
- else
- {
- trie[][i] = ;
- }
- }
- while(head != tail)
- {
- front = que[head++];
- if(o[fail[front]])
- o[front] = ;
- for(i = ;i < ;i ++)
- {
- if(trie[front][i] != -)
- {
- que[tail++] = trie[front][i];
- fail[trie[front][i]] = trie[fail[front]][i];
- }
- else
- {
- trie[front][i] = trie[fail[front]][i];
- }
- }
- }
- }
- int main()
- {
- int n,i,j,k,len,flag,cas = ;
- char str[];
- while(scanf("%d",&n)!=EOF)
- {
- if(n == ) break;
- CL();
- for(i = ;i <= n;i ++)
- {
- scanf("%s",str);
- insert(str);
- }
- build_ac();
- scanf("%s",str);
- len = strlen(str);
- for(i = ;i <= len;i ++)
- {
- for(j = ;j <= t;j ++)
- dp[i][j] = INF;
- }
- dp[][] = ;
- for(i = ;i < len;i ++)
- {
- for(j = ;j < t;j ++)
- {
- if(o[j]) continue;
- for(k = ;k < ;k ++)
- {
- if(o[trie[j][k]]) continue;
- flag = !(k == judge(str[i]));
- dp[i+][trie[j][k]] = min(dp[i+][trie[j][k]],dp[i][j] + flag);
- }
- }
- }
- int ans = INF;
- for(i = ;i < t;i ++)
- {
- ans = min(ans,dp[len][i]);
- }
- printf("Case %d: ",cas ++);
- if(ans == INF)
- printf("-1\n");
- else
- printf("%d\n",ans);
- }
- return ;
- }
POJ 3691 DNA repair(AC自动机+DP)的更多相关文章
- 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
题目链接:https://vjudge.net/problem/HDU-2457 DNA repair Time Limit: 5000/2000 MS (Java/Others) Memory ...
- [hdu2457]DNA repair(AC自动机+dp)
题意:给出一些不合法的模式DNA串,给出一个原串,问最少需要修改多少个字符,使得原串中不包含非法串. 解题关键:多模式串匹配->AC自动机,求最优值->dp,注意在AC自动机上dp的套路. ...
- poj 2778 DNA Sequence AC自动机DP 矩阵优化
DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11860 Accepted: 4527 Des ...
- POJ 3691 DNA repair ( Trie图 && DP )
题意 : 给出 n 个病毒串,最后再给出一个主串,问你最少改变主串中的多少个单词才能使得主串中不包含任何一个病毒串 分析 : 做多了AC自动机的题,就会发现这些题有些都是很套路的题目.在构建 Trie ...
- POJ3691 DNA repair(AC自动机 DP)
给定N个长度不超过20的模式串,再给定一个长度为M的目标串S,求在目标串S上最少改变多少字符,可以使得它不包含任何的模式串 建立Trie图,求得每个节点是否是不可被包含的串,然后进行DP dp[i][ ...
- HDU 2457 DNA repair (AC自动机+DP)
题意:给N个串,一个大串,要求在最小的改变代价下,得到一个不含上述n个串的大串. 思路:dp,f[i][j]代表大串中第i位,AC自动机上第j位的最小代价. #include<algorithm ...
- POJ 2778 DNA Sequence (AC自动机+DP+矩阵)
题意:给定一些串,然后让你构造出一个长度为 m 的串,并且不包含以上串,问你有多少个. 析:很明显,如果 m 小的话 ,直接可以用DP来解决,但是 m 太大了,我们可以认为是在AC自动机图中,根据离散 ...
- POJ 3691 DNA repair (DP+AC自动机)
DNA repair Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4815 Accepted: 2237 Descri ...
随机推荐
- HTML5/CSS3开发工具
1.谷歌Google Web Designer https://www.google.com/webdesigner/ 这个工具不能在xp上运行,可以在win7 win8上运行 http://www. ...
- css 属性
部分属性在firefox 中添加-moz- safari 以及chrome 加上-webkit- opera 加上-o- ie9里可能需要-ms- jquery 中的css 操作 和一般的cs ...
- mysqldump备份
备份工具1.mysqldump(数据量很大时不推荐使用) myisam 锁表 innodb 行锁 mysqldump --help | less #查看mysql所有的语法 mysqldu ...
- ffplay mini 媒体播放器
下载 http://pan.baidu.com/s/1dDcp3lZ 一定要解压到 D:\ffplay\ 目录下 双击 OpenWith_FFPlay_mini.reg 注册ffplay 在视频文件名 ...
- Java for LeetCode 041 First Missing Positive
Given an unsorted integer array, find the first missing positive integer. For example, Given [1,2,0] ...
- [Android Pro] 监听WIFI 打开广播
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-perm ...
- hadoop启动后jps没有namenode(转)
hadoop启动后jps没有namenode 一般都是由于两次或两次以上格式化NameNode造成的,有两种方法可以解决: 1.删除DataNode的所有资料 2.修改每个DataNode的names ...
- Linux使用tcpdump命令抓包保存pcap文件wireshark分析
[root@ok Desktop]# yum search tcpdump Loaded plugins: fastestmirror, refresh-packagekit, security Lo ...
- Java Hour 57 Java Architecture
Java 的架构中有4个重要的组成部分: 1 Java programming langrage 2 Java class file format 3 Java API 4 Java virtual ...
- js event 事件兼容浏览器 ie不需要 event参数 firefox 需要
js event 事件兼容浏览器 ie不需要 event参数 firefox 需要 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 ...