题面链接

题解

首先构建出AC自动机
然后在AC自动机上面跑DP
转移很显然从Trie树的节点跳到他的儿子节点
但是要注意一个问题,
在计算的时候,每一个节点加入后能够
造成的贡献
要加上他的子串的贡献
至于DP:
设f[i][j]表示已经使用了i个字母
当前在Trie树的第j个节点上面能够产生的最大贡献
很显然,转移到他的儿子节点上面,同时统计贡献即可

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 1000000
int N,K;
int tot=0,ans;
char s[20];
int f[1100][400];
struct Node
{int vis[3];int p;int fail;
}t[5000];
void Add(char *s)
{int l=strlen(s);int now=0;for(int i=0;i<l;++i){if(!t[now].vis[s[i]-'A'])t[now].vis[s[i]-'A']=++tot;now=t[now].vis[s[i]-'A'];}t[now].p++;
}
void Build()
{queue<int> Q;for(int i=0;i<3;++i)if(t[0].vis[i])Q.push(t[0].vis[i]);while(!Q.empty()){int u=Q.front();Q.pop();for(int i=0;i<3;++i){if(t[u].vis[i]){t[t[u].vis[i]].fail=t[t[u].fail].vis[i];Q.push(t[u].vis[i]);}elset[u].vis[i]=t[t[u].fail].vis[i];}t[u].p+=t[t[u].fail].p;}
}
void DP()
{for(int T=0;T<=K;++T)for(int i=1;i<=tot;++i)f[T][i]=-INF;for(int T=1;T<=K;++T)for(int i=0;i<=tot;++i)for(int j=0;j<3;++j)f[T][t[i].vis[j]]=max(f[T][t[i].vis[j]],f[T-1][i]+t[t[i].vis[j]].p);for(int i=0;i<=tot;++i)ans=max(ans,f[K][i]);
}
int main()
{scanf("%d%d",&N,&K);for(int i=1;i<=N;++i){scanf("%s",s);Add(s);}Build();DP();printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/7647485.html

【Luogu3041】视频游戏的连击(AC自动机,动态规划)相关推荐

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

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

  2. luogu P3041 [USACO12JAN]视频游戏的连击Video Game Combos

    P3041 [USACO12JAN]视频游戏的连击Video Game Combos 题目大意: 给出n个字符串st[1-n],求一个长度为K的字符串,每匹配到st中的字符串就+1分,问最多能加几分 ...

  3. 【洛谷 P3041】 [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机,dp)

    题目链接 手写一下AC自动机(我可没说我之前不是手写的) Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和. #include <cstdio> # ...

  4. [洛谷3041]视频游戏的连击Video Game Combos

    题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...

  5. 【题解】[USACO12JAN]视频游戏的连击Video Game Combos

    好久没有写博客了,好惭愧啊--虽然这是一道弱题但还是写一下吧. 这道题目的思路应该说是很容易形成:字符串+最大值?自然联想到学过的AC自动机与DP.对于给定的字符串建立出AC自动机,dp状态dp[i] ...

  6. [BZOJ4861][Beijing2017]魔法咒语 AC自动机+动态规划+矩阵快速幂

    对忌讳词语构建AC自动机 Fi,j F_{i,j}表示长度为 i i,匹配到AC自动机第jj位的合法串方案数 当状态数少的时候用矩阵转移 #include <bits/stdc++.h> ...

  7. 【USACO12JAN】—视频游戏的连击Video Game Combos(AC自动机+dp)

    描述 贝西在玩一款游戏,该游戏只有三个技能键 "A""B""C"可用,但这些键可用形成N种(1 <= N<= 20)特定的组合技 ...

  8. [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos

    题面 sol 设\(f_{i,j}\)表示填了前\(i\)个字母,在\(AC\)自动机上跑到了节点\(j\)的最大得分.因为匹配需要暴跳\(fail\)所以预先把\(fail\)指针上面的匹配数传下来 ...

  9. BZOJ 1444 [JSOI2009]有趣的游戏 (Trie图/AC自动机+矩阵求逆)

    题目大意:给你$N$个长度相等且互不相同的模式串,现在有一个字符串生成器会不断生成字符,其中每个字符出现的概率是$p_{i}/q_{i}$,当生成器生成的字符串包含了某个模式串,则拥有该模式串的玩家胜 ...

最新文章

  1. 数据结构(C语言版) 第 八 章 排序 知识梳理 + 习题详解
  2. SAP移动战略与HANA已为BI爆发做好准备
  3. python简单笔记
  4. C++ Socket 实例
  5. Akka异步通讯《three》译
  6. Ubuntu 安装 VMware 15
  7. 欧姆龙plc学习笔记(八)(上传nb程序)
  8. ShenYu网关数据同步源码分析
  9. 单树莓派/双树莓派+USRP+srsLTE分布式搭建4G LTE微基站
  10. 手把手教你从零开始腾讯云服务器部署
  11. 基于STM32F103+涂鸦三明治的宠物自动喂食器
  12. 房屋租赁合同中“天价违约金”的约定是否有效?
  13. [渝粤教育] 徐州工业职业技术学院 药物分离技术 参考 资料
  14. 2023南京信息工程大学计算机考研信息汇总
  15. vivox9系统基于Android,vivo X9
  16. kettle案例21-将字段值设置为常量
  17. 探讨Linux CPU的上下文切换原由
  18. 思源字体的安装和使用
  19. 《零基础数学建模》——最大最小化模型
  20. 《赢在中国》精彩评语 2007年度

热门文章

  1. 40个常用的网站制作技巧
  2. 编程模拟洗牌和发牌过程c语言,洗牌发牌模拟系统课程设计报告.doc
  3. 结构题直接定义赋值语句
  4. python怎么保存数据框转置结果_python – 如何转置pandas数据帧以交叉制表保存所有值的数据帧...
  5. 计算机cg专业,cg行业要学哪个专业好
  6. 软件架构师证书有用吗_健康管理师证书在求职时有用吗?
  7. php 字符串排序 带数组,php – 按字符串排序的多维数组
  8. Android客户端多线程实例分析
  9. 树莓派 SyntaxError: invalid syntax(python错误)
  10. 【深度学习】(6) tensorflow2.0使用keras高层API