P3041 [USACO12JAN]视频游戏的连击Video Game Combos
题意:贝西在玩一款游戏,该游戏只有三个技能键 “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相关推荐
- luogu P3041 [USACO12JAN]视频游戏的连击Video Game Combos
P3041 [USACO12JAN]视频游戏的连击Video Game Combos 题目大意: 给出n个字符串st[1-n],求一个长度为K的字符串,每匹配到st中的字符串就+1分,问最多能加几分 ...
- 【洛谷 P3041】 [USACO12JAN]视频游戏的连击Video Game Combos(AC自动机,dp)
题目链接 手写一下AC自动机(我可没说我之前不是手写的) Trie上dp,每个点的贡献加上所有是他后缀的串的贡献,也就是这个点到根的fail链的和. #include <cstdio> # ...
- 【题解】[USACO12JAN]视频游戏的连击Video Game Combos
好久没有写博客了,好惭愧啊--虽然这是一道弱题但还是写一下吧. 这道题目的思路应该说是很容易形成:字符串+最大值?自然联想到学过的AC自动机与DP.对于给定的字符串建立出AC自动机,dp状态dp[i] ...
- [Luogu3041][USACO12JAN]视频游戏的连击Video Game Combos
题面 sol 设\(f_{i,j}\)表示填了前\(i\)个字母,在\(AC\)自动机上跑到了节点\(j\)的最大得分.因为匹配需要暴跳\(fail\)所以预先把\(fail\)指针上面的匹配数传下来 ...
- [USACO12JAN]视频游戏的连击Video Game Combos
很早之前就做过啦 补一下题解 F(i,j)前i个的字符为j的匹配 注意end要累加 #include<iostream> #include<cstdio> #include&l ...
- 洛谷 P3041 视频游戏的连击Video Game Combos(AC自动机+拓扑排序+数位DP)
洛谷 P3041 视频游戏的连击Video Game Combos 难度一般,不过这个数位DP其实应该叫做记忆化搜索 题意:玩游戏时可以通过按键组合打出combo技能:然后是已知N个combo的按键方 ...
- 【USACO12JAN】视频游戏的连击Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
- 【USACO12JAN】—视频游戏的连击Video Game Combos(AC自动机+dp)
描述 贝西在玩一款游戏,该游戏只有三个技能键 "A""B""C"可用,但这些键可用形成N种(1 <= N<= 20)特定的组合技 ...
- [洛谷3041]视频游戏的连击Video Game Combos
题目描述 Bessie is playing a video game! In the game, the three letters 'A', 'B', and 'C' are the only v ...
最新文章
- 思维dp ---- Codeforces Round #722 (Div. 1) B. Kavi on Pairing Duty [思维dp + 数学]
- 来人呐,有人又要抢钱啦!
- python—操作MySQL查询表中数据
- java一年包装_浅谈Java的包装类
- 手动制作python的exe可执行程序
- win2008 查询 tcp连接失败_TCP详解(转)
- 信息学奥赛一本通(1115:直方图)
- word vba 读出光标所在的列数_word高效技巧:这几个表格操作让工作更快速
- 【clickhouse】clickhouse 临时表
- JavaScript基础知识(四)
- Windows2003环境下的一键系统安全
- Android 设置按钮为透明
- 控制反转与依赖注入概述——Spring IOC/DI(一)
- 图像的上采样与下采样
- 又一个新概念——云编程(Cloud programming)
- 神州优车联合体斥资近40亿控股宝沃 建立联合营销工作小组
- demonstration记忆_记忆英语单词方法20种
- css 绘制心形图案
- Spring 之 @Cacheable 源码解析(下)
- 安卓期末大作业——汉服社区(源码+任务书)