博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 2580 [Usaco2012 Jan]Video Game
阅读量:6253 次
发布时间:2019-06-22

本文共 1726 字,大约阅读时间需要 5 分钟。

BZOJ_2580

    可以先将字典树建出来并补成trie图,然后就可以用f[i][j]表示第i步走到第j个节点的时一共生成了多少个串,至于走到一个节点时会新增多少个串可以预处理出来,这样在trie图上进行dp即可。

#include
#include
#include
#define MAXD 310#define MAXK 1010#define inf 0xc3c3c3c3int N, K, next[MAXD][3], num[MAXD], e, f[MAXK][MAXD], q[MAXD], P[MAXD];void add(int cur, int k){ memset(next[e], 0, sizeof(next[e])); num[e] = 0; next[cur][k] = e ++;}void init(){ char b[20]; memset(next[0], 0, sizeof(next[0])); num[0] = 0, e = 1; for(int i = 0; i < N; i ++) { scanf("%s", b); int cur = 0; for(int j = 0; b[j]; j ++) { int k = b[j] - 'A'; if(!next[cur][k]) add(cur, k); cur = next[cur][k]; } ++ num[cur]; } int rear = 0; q[rear ++] = 0; for(int i = 0; i < rear; i ++) { int x = q[i]; num[x] += num[P[x]]; for(int j = 0; j < 3; j ++) { if(next[x][j]) { q[rear ++] = next[x][j]; if(x == 0) P[next[x][j]] = 0; else P[next[x][j]] = next[P[x]][j]; } else next[x][j] = next[P[x]][j]; } }}void solve(){ memset(f, 0xc3, sizeof(f)); f[0][0] = 0; for(int i = 0; i < K; i ++) for(int j = 0; j < e; j ++) if(f[i][j] != inf) for(int k = 0; k < 3; k ++) { int x = next[j][k]; f[i + 1][x] = std::max(f[i + 1][x], f[i][j] + num[x]); } int ans = 0; for(int i = 0; i < e; i ++) ans = std::max(ans, f[K][i]); printf("%d\n", ans);}int main(){ while(scanf("%d%d", &N, &K) == 2) { init(); solve(); } return 0;}

 

 

转载地址:http://ndnsa.baihongyu.com/

你可能感兴趣的文章
干货型up主
查看>>
获取页面中所有dropdownlist类型控件
查看>>
读《淘宝数据魔方技术架构解析》有感
查看>>
rm 命令(转)
查看>>
[禅悟人生]真知从实践中来
查看>>
Chrome 报 Resource interpreted as Script but transferred with MIME type text/plain 警告的解决办法...
查看>>
memcpy的使用方法总结
查看>>
[转载]如何破解Excel VBA密码
查看>>
【BZOJ】3757: 苹果树
查看>>
递归函数的概念使用方法与实例
查看>>
cf451C-Predict Outcome of the Game
查看>>
struct dev_t
查看>>
Java 原型模式
查看>>
题目:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。
查看>>
手机web——自适应网页设计(html/css控制) - 51CTO.COM
查看>>
ibatis resultMap 的用法
查看>>
【BZOJ】2563: 阿狸和桃子的游戏
查看>>
redis 中文字符显示
查看>>
webview与JS的交互
查看>>
国内外MD5在线解密网站
查看>>