欢迎访问~原文出处——博客园-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 病毒检测 动态规划的更多相关文章

  1. [bzoj1966][Ahoi2005][VIRUS 病毒检测] (字符串dp)

    Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...

  2. bzoj1966: [Ahoi2005]VIRUS 病毒检测

    Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...

  3. BZOJ1966: [Ahoi2005]VIRUS 病毒检测 Trie+搜索

    Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...

  4. bzoj千题计划205:bzoj1966: [Ahoi2005]VIRUS 病毒检测

    http://www.lydsy.com/JudgeOnline/problem.php?id=1966 f[i][j] 表示s的前i个和t的前j个是否匹配 转移看代码 注意初始化: f[0][0]= ...

  5. 【AHOI2005】病毒检测

    题目描述 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地. 科学家们经过几 ...

  6. 【BZOJ1966】[AHOI2005]病毒检测(动态规划)

    [BZOJ1966][AHOI2005]病毒检测(动态规划) 题面 BZOJ 洛谷 题解 我就蒯了一份代码随便改了改怎么就过了??? 从这道题目蒯的 代码: #include<iostream& ...

  7. 基于深度学习的病毒检测技术无需沙箱环境,直接将样本文件转换为二维图片,进而应用改造后的卷积神经网络 Inception V4 进行训练和检测

    话题 3: 基于深度学习的二进制恶意样本检测 分享主题:全球正在经历一场由科技驱动的数字化转型,传统技术已经不能适应病毒数量飞速增长的发展态势.而基于沙箱的检测方案无法满足 APT 攻击的检测需求,也 ...

  8. bzoj1966:[AHOI2005]病毒检测

    传送门 我也没想到map如此垃圾,bitset优秀啊 直接trie树上搜索就好了 代码: #include<cstdio> #include<iostream> #includ ...

  9. [AHOI2005]病毒检测

    Description 科学家们在Samuel星球上的探险仍在继续.非常幸运的,在Samuel星球的南极附近,探险机器人发现了一个巨大的冰湖!机器人在这个冰湖中搜集到了许多RNA片段运回了实验基地.科 ...

随机推荐

  1. 20155302 2016-2017-2 《Java程序设计》第九周学习总结

    20155302 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 基本数据库操作相关的JDBC接口或类是位于java.sql包中.在程序中要取得数据库联机,我 ...

  2. Ubuntu 18.04换国内源 中科大源 阿里源 163源 清华源

    感觉还是18.4好用,所以最近装回了18,感觉现在18的兼容性也还可以了,深度学习的环境配置都没有问题,就是安装软件的时候有点慢,所以想要更新一下源. 第一步: 编辑/etc/apt/sources. ...

  3. Window上,启动Tomcat服务之后,关闭启动窗口,服务器也随之关闭

    在Window环境上,启动Tomcat服务器之后,随手关闭启动窗口,服务器也随之关闭了. 现在想要的效果是,当关闭启动窗口后,服务器仍然运行. 1. 开始:运行cmd,进入doc命令行 tomcat安 ...

  4. d 属性: 赋予字段执行动作的能力

    1.对只读属性误解 property AppSetting: ISuperobject read fAppSetting;当看到 AppInfo.AppSetting.D['lastLat'] := ...

  5. 深入剖析ThreadLocal实现原理以及内存泄漏问题

    关于ThreadLocalMap<ThreadLocal, Object>弱引用问题: 当线程没有结束,但是ThreadLocal已经被回收,则可能导致线程中存在ThreadLocalMa ...

  6. 【docx4j】docx4j操作docx,实现替换内容、转换pdf、html等操作

    主要是想要用此功插件操作docx,主要的操作就是操作段落等信息,另外,也想实现替换docx的内容,实现根据模板动态生成内容的效果,也想用此插件实现docx转换pdf. word的格式其实可以用xml来 ...

  7. SpringBoot注册Servlet、Filter、Listener

    SpringBoot默认是以jar包的方式启动嵌入式的Servlet容易来启动SpringBoot的Web应用,没有web.xml文件 因此我们可以使用以下方式来注册Servlet.Filter.Li ...

  8. 【Mysql sql inject】【入门篇】SQLi-Labs使用 part 1【01-11】

    人员流动性过大一直是乙方公司痛点.虽然试用期间都有岗前学习,但老员工忙于项目无暇带新人成长,入职新人的学习基本靠自己不断摸索.期望看相关文档就可以一蹴而是不现实的.而按部就班的学习又很难短期内将知识有 ...

  9. 【转】SSH服务详解

    [转]SSH服务详解 第1章 SSH服务 1.1 SSH服务协议说明 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Gro ...

  10. MIPI协议学习总结(一)

    一.MIPI 简介: MIPI(移动行业处理器接口)是Mobile Industry Processor Interface的缩写.MIPI是MIPI联盟发起的为移动应用处理器制定的开放标准. 已经完 ...