[USACO12Jan][luogu3041] Video Game Combos [AC自动机+dp]
题面
传送门
思路
首先,有一个非常显然的思路就是dp:
设$dp[i][j]$表示前i个字符,最后一个为j
然后发现这个东西有后效性
改!设$dp[i][j]$代表前i个字符,最后15个的状态为j(压缩一下),转移的是候枚举增加那个字符,然后看从谁可以推过来
然后就TLE了,完全无压力
怎么优化这个算法?
显然,枚举完增加哪个字符以后,可以用AC自动机来实现多模匹配
然后发现:我们把j的定义变成AC自动机上面的点j,这样一个点就代表一种状态,状态之间互相不重复,而且也没有后效性
这样的定义方法还有一个好处:状态少,从$3^{15}$个变成了$300$个
于是我们得到最终做法:
最终算法
对于输入的模板串建立AC自动机
令$dp[i][j]$表示前i个字符,最后一个字符跑到AC自动机的第j位上的最大答案
于是我们只要对于每个$dp[i][j]$枚举下一个是A,B,C,转移到下一个节点j',然后跳一遍fail指针
对于匹配到的一个长度为k的模板串,$dp[i+1][j']=max\left(dp[i+1][j'],dp[i-k][j]\right)$
最后答案就是$dp[K][i]$的最大值
Code
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct node{int num,fail,son[3];node(){num=fail=0;memset(son,0,sizeof(son));}
}a[510];int cnt;
void add(char s[]){//插入字符串到trieint len=strlen(s),i,cur=0;for(i=0;i<len;i++){if(!a[cur].son[s[i]-'A']) a[cur].son[s[i]-'A']=++cnt;cur=a[cur].son[s[i]-'A'];}a[cur].num++;
}
void getfail(){//bfs求fail指针int u,v,q[510],head=0,tail=0,i;for(i=0;i<3;i++){if(!a[0].son[i]) continue;a[0].fail=0;q[tail++]=a[0].son[i];}while(head<tail){u=q[head++];for(i=0;i<3;i++){v=a[u].son[i];if(v) a[v].fail=a[a[u].fail].son[i],q[tail++]=v;else a[u].son[i]=a[a[u].fail].son[i];}}
}
int m,n,dp[1010][510];bool vis[1010][510];
int proc(int cur,int val){//跳fail指针求值while(cur) val+=a[cur].num,cur=a[cur].fail;return val;
}
int main(){scanf("%d%d",&m,&n);int i,j,k,tmp;char s[20];for(i=1;i<=m;i++) scanf("%s",s),add(s);getfail();vis[0][0]=1;for(i=0;i<n;i++){for(j=0;j<=cnt;j++){if(!vis[i][j]) continue;for(k=0;k<3;k++){tmp=a[j].son[k];dp[i+1][tmp]=max(dp[i+1][tmp],proc(tmp,dp[i][j]));vis[i+1][tmp]=1;}}}int ans=0;for(i=0;i<=cnt;i++) ans=max(ans,dp[n][i]);printf("%d\n",ans);
}
转载于:https://www.cnblogs.com/dedicatus545/p/8907126.html
[USACO12Jan][luogu3041] Video Game Combos [AC自动机+dp]相关推荐
- CDOJ1633 Video Game Combos [AC自动机+dp]
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...
- 洛谷 P3041 视频游戏的连击Video Game Combos(AC自动机+拓扑排序+数位DP)
洛谷 P3041 视频游戏的连击Video Game Combos 难度一般,不过这个数位DP其实应该叫做记忆化搜索 题意:玩游戏时可以通过按键组合打出combo技能:然后是已知N个combo的按键方 ...
- uvalive4842(AC自动机+DP)
题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...
- HDU 2296 Ring AC自动机 + DP
题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路: AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...
- bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)
1030: [JSOI2007]文本生成器 Time Limit: 1 Sec Memory Limit: 162 MB Submit: 5187 Solved: 2136 [Submit][St ...
- 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂
[题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...
- P3041 [USACO12JAN]Video Game Combos【AC自动机+DP】
时空限制 1000ms / 128MB 题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', an ...
- 【AC自动机+DP】[USACO JAN2012 GOLD Problem 1: Video Game Combos]
题目大意 题目大意:给定有ABC组成的串n个,然后请你生成一个长度为K的串求给定的串在生成串中最多被匹配时的次数 分析 AC自动机模板题. 构建trie,然后DP. p是当前节点,l是已经构造的串的长 ...
- [USACO12JAN][SPOJ10502][Luogu3041]Video Game Combos
传送门 SPOJ10502 Luogu3041 Description Bessie is playing a video game! In the game, the three letters ' ...
最新文章
- 赠票 | 中国数据智能管理峰会(上海)
- DSP/BIOS中的数据类型
- jmeter在linux上运行
- 58同城创始人姚劲波:未来十年是中国创业最好机会
- ubuntu配置java_Ubuntu 16.04下Java环境安装与配置
- Java Spring实现原理研究之Servlet initialization初始化过程
- 职业学校计算机主要学什么条件,职业学校计算机教学计划
- c语言数组统计条形图,【D3.js数据可视化系列教程】--(十)更自由的条形图
- jQuery+CSS五类验证码(字母、数字、滑动、点击)
- ORACLE监听器TNS服务不能启动的问题解决(转自:http://www.cnweblog.com/sunGIS/archive/2006/08/21/124117.html)...
- 如何用Camtasia进行内容补充?
- think in java bruce eckel_java大师 Bruce Eckel 批评java
- sap销售发货的流程_基于SAP系统批量创建销售订单及交货单过账的方法与流程
- 简析:世博会燃印刷业激情
- App微信小程序测试流程及要点
- 《计算机安全与防护》教学反思,“计算机安全与防护教学设计”教学设计...
- 超大源码库使用git clone --mirror克隆远程代码制作镜像失败的处理办法
- 情景式领导力学习(1) - 介绍
- 使用Fiona创建Shapefile矢量数据
- 推动计算机革命的幕后黑手
热门文章
- 手把手教学搭建ntp服务器
- 5大网络排障工具,擅长使用这些的网工受益无穷
- 前端三剑客——CSS
- struts2的s:password标签问题!
- YDOOK:CSDN 1024 程序员节日专文:Ubuntu remotely install cuda
- VR系列——Oculus最佳实践:二、双眼视觉,立体成像和深度线索
- linux sdk 封装,集成方式-Linux开发集成-SDK开发集成-IM即时通讯-网易云信开发文档...
- javascript BOM与DOM介绍
- iphone已停用解锁大概多少钱_iphone已停用解锁详细教程
- 数据中台四大核心体系