题面

传送门

思路

首先,有一个非常显然的思路就是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]相关推荐

  1. CDOJ1633 Video Game Combos [AC自动机+dp]

    题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...

  2. 洛谷 P3041 视频游戏的连击Video Game Combos(AC自动机+拓扑排序+数位DP)

    洛谷 P3041 视频游戏的连击Video Game Combos 难度一般,不过这个数位DP其实应该叫做记忆化搜索 题意:玩游戏时可以通过按键组合打出combo技能:然后是已知N个combo的按键方 ...

  3. uvalive4842(AC自动机+DP)

    题意: 给出猴子打字时打某个字母的概率,猴子最多可以敲键盘m次,问得到的长度是m的单词包含模式串的概率. 思路: AC自动机+dp. 首先,我们用模式串构造一个AC自动机,用dp[i]][j]表示当前 ...

  4. HDU 2296 Ring AC自动机 + DP

    题意:给你n个模式串,每个模式串有一个得分,让你构造出一个长度为N之内且分数最高的文本串;输出字典序列最小的. 解题思路:  AC自动机 + DP , 不过要输出字典序列最小,多开一个 一个三维字符串 ...

  5. bzoj 1030: [JSOI2007]文本生成器(AC自动机+DP)

    1030: [JSOI2007]文本生成器 Time Limit: 1 Sec  Memory Limit: 162 MB Submit: 5187  Solved: 2136 [Submit][St ...

  6. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  7. P3041 [USACO12JAN]Video Game Combos【AC自动机+DP】

    时空限制 1000ms / 128MB 题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', an ...

  8. 【AC自动机+DP】[USACO JAN2012 GOLD Problem 1: Video Game Combos]

    题目大意 题目大意:给定有ABC组成的串n个,然后请你生成一个长度为K的串求给定的串在生成串中最多被匹配时的次数 分析 AC自动机模板题. 构建trie,然后DP. p是当前节点,l是已经构造的串的长 ...

  9. [USACO12JAN][SPOJ10502][Luogu3041]Video Game Combos

    传送门 SPOJ10502 Luogu3041 Description Bessie is playing a video game! In the game, the three letters ' ...

最新文章

  1. 赠票 | 中国数据智能管理峰会(上海)
  2. DSP/BIOS中的数据类型
  3. jmeter在linux上运行
  4. 58同城创始人姚劲波:未来十年是中国创业最好机会
  5. ubuntu配置java_Ubuntu 16.04下Java环境安装与配置
  6. Java Spring实现原理研究之Servlet initialization初始化过程
  7. 职业学校计算机主要学什么条件,职业学校计算机教学计划
  8. c语言数组统计条形图,【D3.js数据可视化系列教程】--(十)更自由的条形图
  9. jQuery+CSS五类验证码(字母、数字、滑动、点击)
  10. ORACLE监听器TNS服务不能启动的问题解决(转自:http://www.cnweblog.com/sunGIS/archive/2006/08/21/124117.html)...
  11. 如何用Camtasia进行内容补充?
  12. think in java bruce eckel_java大师 Bruce Eckel 批评java
  13. sap销售发货的流程_基于SAP系统批量创建销售订单及交货单过账的方法与流程
  14. 简析:世博会燃印刷业激情
  15. App微信小程序测试流程及要点
  16. 《计算机安全与防护》教学反思,“计算机安全与防护教学设计”教学设计...
  17. 超大源码库使用git clone --mirror克隆远程代码制作镜像失败的处理办法
  18. 情景式领导力学习(1) - 介绍
  19. 使用Fiona创建Shapefile矢量数据
  20. 推动计算机革命的幕后黑手

热门文章

  1. 手把手教学搭建ntp服务器
  2. 5大网络排障工具,擅长使用这些的网工受益无穷
  3. 前端三剑客——CSS
  4. struts2的s:password标签问题!
  5. YDOOK:CSDN 1024 程序员节日专文:Ubuntu remotely install cuda
  6. VR系列——Oculus最佳实践:二、双眼视觉,立体成像和深度线索
  7. linux sdk 封装,集成方式-Linux开发集成-SDK开发集成-IM即时通讯-网易云信开发文档...
  8. javascript BOM与DOM介绍
  9. iphone已停用解锁大概多少钱_iphone已停用解锁详细教程
  10. 数据中台四大核心体系