BZOJ1966 [Ahoi2005]VIRUS 病毒检测 动态规划
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1966
题意概括
现在有一些串和一个病毒模板。让你统计非病毒串的总数。串个数<=500。
串由'A' 'C' 'G' 'T'构成,长度<=500。
病毒模板(长度<=1000)较为复杂,由'A' 'C' 'G' 'T' '*' '?'组成。其中'A' 'C' 'G' 'T'没有特异功能。但是'*' 和 '?'有特意功能:
'*':在这里可以填充任意长度的任意串(由A,C,G,T组成,长度可以为0)。
'?':在这里能且仅能填一个字母,这个字母在A,C,G,T中选。
如果病毒模板通过在'.'和'?'中填字母可以做到和某一个串相同,那么这个串就是病毒串。反之就是非病毒串。
题解
我们发现连续的'*'是没用的可以压成一个'*',花几行代码压掉。
然后对于每一个串,我们跑一个二维的dp。
用f[i][j]表示从病毒串的第i位开始,当前串的第j位开始,能否得到匹配。
那么有3种转移:
1. 当前模板位为‘*’,那么我们可以考虑结束'*'或者继续匹配当前串,故f[i][j]=f[i][j+1] or f[i+1][j]
2. 当前模板位为'?',那么我们只能做到和当前字符匹配,故f[i][j]=f[i+1][j+1]
3. 当前模板位为字符,那么我判断一下和当前串位是否相同,如果不同那么f[i][j]=0,否则f[i][j]=f[i+1][j+1]
注意特殊情况:
最后的时候,模板串还有'*',但是当前串已经匹配完的情况要注意一下。
dp主体写在dfs里面。
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int M=1005,N=505;
int t,n,m,ans=0,f[M][N];
char str[M],ch[N];
void recreate(){
int m_=1;
for (int i=2;i<=m;i++)
if (!(str[i]==str[i-1]&&str[i]=='*'))
str[++m_]=str[i];
m=m_;
}
bool dfs(int x,int y){
if (~f[x][y])
return f[x][y];
if (x>m&&y>n)
return f[x][y]=1;
if (str[x]=='*'&&y>n)
return f[x][y]=dfs(x+1,y);
if (x>m||y>n)
return f[x][y]=0;
if (str[x]=='?')
return f[x][y]=dfs(x+1,y+1);
if (str[x]=='*')
return f[x][y]=dfs(x,y+1)||dfs(x+1,y);
if (str[x]!=ch[y])
return f[x][y]=0;
return f[x][y]=dfs(x+1,y+1);
}
int main(){
scanf("%s",str+1);
m=strlen(str+1);
recreate();
scanf("%d",&t);
for (int i=1;i<=t;i++){
scanf("%s",ch+1);
n=strlen(ch+1);
memset(f,-1,sizeof f);
if (!dfs(1,1))
ans++;
}
printf("%d",ans);
return 0;
}
BZOJ1966 [Ahoi2005]VIRUS 病毒检测 动态规划的更多相关文章
- [bzoj1966][Ahoi2005][VIRUS 病毒检测] (字符串dp)
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- bzoj1966: [Ahoi2005]VIRUS 病毒检测
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- BZOJ1966: [Ahoi2005]VIRUS 病毒检测 Trie+搜索
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
- bzoj千题计划205:bzoj1966: [Ahoi2005]VIRUS 病毒检测
http://www.lydsy.com/JudgeOnline/problem.php?id=1966 f[i][j] 表示s的前i个和t的前j个是否匹配 转移看代码 注意初始化: f[0][0]= ...
- 【AHOI2005】病毒检测
题目描述 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地. 科学家们经过几 ...
- 【BZOJ1966】[AHOI2005]病毒检测(动态规划)
[BZOJ1966][AHOI2005]病毒检测(动态规划) 题面 BZOJ 洛谷 题解 我就蒯了一份代码随便改了改怎么就过了??? 从这道题目蒯的 代码: #include<iostream& ...
- 基于深度学习的病毒检测技术无需沙箱环境,直接将样本文件转换为二维图片,进而应用改造后的卷积神经网络 Inception V4 进行训练和检测
话题 3: 基于深度学习的二进制恶意样本检测 分享主题:全球正在经历一场由科技驱动的数字化转型,传统技术已经不能适应病毒数量飞速增长的发展态势.而基于沙箱的检测方案无法满足 APT 攻击的检测需求,也 ...
- bzoj1966:[AHOI2005]病毒检测
传送门 我也没想到map如此垃圾,bitset优秀啊 直接trie树上搜索就好了 代码: #include<cstdio> #include<iostream> #includ ...
- [AHOI2005]病毒检测
Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...
随机推荐
- 法律AI数据及应用
本文简单列举了法律AI目前的应用,数据集,研究方向. 历史 1970年,Buchanan和Headrick发表文章"关于人工智能和法律推理的一些猜测",讨论了对法律研究和推理进行建 ...
- Mac改键软件Karabiner使用教程
Mac改键软件Karabiner使用教程 目前Mac上比较好用的改键软件是Karabiner,不过对于最新的Sierra系统,Karabiner失效了.这里介绍的实际上是Karabiner-Eleme ...
- luogu P1268 树的重量
一开始把这题想复杂了,,, 这里记\(di[i][j]\)表示\(i\)到\(j\)的距离 首先如果\(n=2\),答案显然为\(di[1][2]\) 如果\(n=3\) 懒得画图了盗图过来 那么3号 ...
- sonarqube6.7安装
1.下载sonarhttps://www.sonarqube.org/#downloads 2.配置JDK1.8 3.centOS默认mysql版本为mariaDB直接安装yum install my ...
- mysql 原理 ~ checkpoint
一 简介:今天咱们来聊聊checkpoint 二 定义: checkpoin是重做日志对数据页刷新到磁盘的操作做的检查点,通过LSN号保存记录,作用是当发生宕机等crash情况时,再次启动时会查询ch ...
- FPN 学习笔记
通常,利用网络对物体进行检测时,浅层网络分辨率高,学到的是图片的细节特征,深层网络,分辨率低,学到的更多的是语义特征. 1).通常的CNN使用如下图中显示的网络,使用最后一层特征图进行预测 例如VGG ...
- 之手算KD-tree
转自:https://zhuanlan.zhihu.com/p/27453420 本文来源于Machine Learning: Clustering & Retrieval | Courser ...
- numpy 中 shape_base提供的tile方法
tile函数 来自于numpy.lib.shape_base 功能:重复某个数组. 比如说tile(A, n), 功能是将数组A重复n次,构成一个新的数组(行数只有1个) 比如说tile(A, n, ...
- kindle转换工具-calibre
kindle转换工具 calibre https://calibre-ebook.com/download_windows
- linux统计某个特定文件名的大小总和【原创】
[hch@EAISRVBJ2 log]$find ./ -name "test_chs_00*"|xargs du -ck|grep total|awk 'BEGIN{sum=0} ...