题意:贝西在玩一款游戏,该游戏只有三个技能键 “A”“B”“C”可用,但这些键可用形成N种(1 <= N<= 20)特定的组合技。第i个组合技用一个长度为1到15的字符串S_i表示。
当贝西输入的一个字符序列和一个组合技匹配的时候,他将获得1分。特殊的,他输入的一个字符序列有可能同时和若干个组合技匹配,比如N=3时,3种组合技分别为"ABA", “CB”, 和"ABACB",若贝西输入"ABACB",他将获得3分。
若贝西输入恰好K (1 <= K <= 1,000)个字符,他最多能获得多少分?

题解:这道题和文本生成器(题目链接)类似,没有刷过的可以尝试一下,感觉这种dp都是套路。
我们用dp[i][j]表示已经匹配的长度为i,当前在j节点的最大得分,然后从父亲往儿子转移即可,要注意的是,如果字符串的子串如果也是能得分的,我们应该将得分加到u中,表示该节点的得分

#include<bits/stdc++.h>
using namespace std;
const int MAXNODE = 1e6+50;
const int INF = 0x3f3f3f3f;
struct Trie{int nxt[MAXNODE][3],fail[MAXNODE],cnt[MAXNODE];int dp[1050][1050];int sz;void Insert(char *s){int root=0,len=strlen(s);for(int i=0;i<len;i++){if(!nxt[root][s[i]-'A']) nxt[root][s[i]-'A'] = ++sz;root = nxt[root][s[i]-'A'];}cnt[root]++;}void Build(){queue<int> que;for(int i=0;i<3;i++)if(nxt[0][i])que.push(nxt[0][i]);while(!que.empty()){int u = que.front();que.pop();for(int i=0;i<3;i++){if(nxt[u][i]) que.push(nxt[u][i]),fail[nxt[u][i]] = nxt[fail[u]][i];else nxt[u][i] = nxt[fail[u]][i];}cnt[u] += cnt[fail[u]];//该点的贡献值应该加上其子串(后缀)的得分}}void Solve(int len){memset(dp,-INF,sizeof(dp));dp[0][0]=0;for(int i=1;i<=len;i++)for(int j=0;j<=sz;j++)for(int k=0;k<3;k++)dp[i][nxt[j][k]] = max(dp[i][nxt[j][k]],dp[i-1][j]+cnt[nxt[j][k]]);int res = 0;for(int i=0;i<=sz;i++)res = max(res,dp[len][i]);printf("%d\n",res);}
}Automata;
char str[20];
int main(){int n,k;scanf("%d%d",&n,&k);for(int i=0;i<n;i++) scanf("%s",str),Automata.Insert(str);Automata.Build();Automata.Solve(k);return 0;
}

P3041 [USACO12JAN]视频游戏的连击Video Game Combos相关推荐

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

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

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

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

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

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

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

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

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

    很早之前就做过啦 补一下题解 F(i,j)前i个的字符为j的匹配 注意end要累加 #include<iostream> #include<cstdio> #include&l ...

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

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

  7. 【USACO12JAN】视频游戏的连击Video Game Combos

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

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

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

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

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

最新文章

  1. 思维dp ---- Codeforces Round #722 (Div. 1) B. Kavi on Pairing Duty [思维dp + 数学]
  2. 来人呐,有人又要抢钱啦!
  3. python—操作MySQL查询表中数据
  4. java一年包装_浅谈Java的包装类
  5. 手动制作python的exe可执行程序
  6. win2008 查询 tcp连接失败_TCP详解(转)
  7. 信息学奥赛一本通(1115:直方图)
  8. word vba 读出光标所在的列数_word高效技巧:这几个表格操作让工作更快速
  9. 【clickhouse】clickhouse 临时表
  10. JavaScript基础知识(四)
  11. Windows2003环境下的一键系统安全
  12. Android 设置按钮为透明
  13. 控制反转与依赖注入概述——Spring IOC/DI(一)
  14. 图像的上采样与下采样
  15. 又一个新概念——云编程(Cloud programming)
  16. 神州优车联合体斥资近40亿控股宝沃 建立联合营销工作小组
  17. demonstration记忆_记忆英语单词方法20种
  18. css 绘制心形图案
  19. Spring 之 @Cacheable 源码解析(下)
  20. 安卓期末大作业——汉服社区(源码+任务书)

热门文章

  1. 长风破浪会有时,直挂云帆济沧海……
  2. 港科大教授权龙:为什么三维重建才是计算机视觉的灵魂?| 对话
  3. Linux下 jupyter notebook的使用
  4. android开发语音播报
  5. 自己动手在阿里云服务器上搭建一套zabbix+grafana监控系统
  6. 掌握 Spring Boot 运行内存及内存参数设置:助力高效应用部署与优化
  7. 教你如何组建家庭卡拉OK系统
  8. 一个简体字对应多个繁体字的例子
  9. 六点定位--坐标系的基础理论
  10. 【软件安装】结合树莓派4B(4G)和Ubuntu20.04的GitLab服务器搭建和使用