日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 luogu P3041 [USACO12JAN]视频游戏的连击Video Game Combos 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

P3041 [USACO12JAN]視頻游戲的連擊Video Game Combos

題目大意:

給出n個字符串st[1…n],求一個長度為K的字符串,每匹配到st中的字符串就+1分,問最多能加幾分

題解

做法十分套路,
先把AC自動機建出來,在建的時候繼承一下nxt的信息
然后就是很簡單的DP了

code:

// luogu-judger-enable-o2 #include<bits/stdc++.h> #define N 305 #define C 3 using namespace std; int ch[N][C], nxt[N], size[N], n, dp[1005][N], tot, K; string st; void insert(){ //插♂入int p = 0, len = st.length();for(int i = 0;i < len; i ++){if(!ch[p][st[i] - 'A']) ch[p][st[i] - 'A'] = ++ tot;p = ch[p][st[i] - 'A'];}size[p] ++;//記一下大小 } queue<int> q; void build(){//日常建樹for(int i = 0; i < C; i ++) if(ch[0][i]) q.push(ch[0][i]);while(q.size()){int u = q.front(); q.pop();size[u] += size[nxt[u]];//繼承一下nxt的信息,這樣匹配一下就行了,不用每次暴力網上跳for(int i = 0; i < C; i ++){if(ch[u][i]){nxt[ch[u][i]] = ch[nxt[u]][i];q.push(ch[u][i]);}else ch[u][i] = ch[nxt[u]][i];}} } int main(){cin >> n >> K;for(int i = 1; i <= n; i ++) cin >> st, insert();build();//DP,dp[i][j] 表示現在是第i位,在AC自動機上的第j個節點,最大的值是多少dp[0][0] = 1;//這是個小技巧,先把初值設為1,最后答案再減1,這樣就不用吧其他的全都設為-INF了for(int i = 0; i < K; i ++) for(int j = 0; j <= tot; j ++){if(!dp[i][j]) continue;for(int k = 0; k < C; k ++){int v = ch[j][k];dp[i + 1][v] = max(dp[i + 1][v], dp[i][j] + size[v]);//簡單的轉移}}int ans = 0;for(int i = 0; i <= tot; i ++) ans = max(ans, dp[K][i]);//找最大cout << ans - 1;//記得減回一return 0; }

坑點:

貌似沒有,就-INF吧

總結

以上是生活随笔為你收集整理的luogu P3041 [USACO12JAN]视频游戏的连击Video Game Combos的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。