yamake's blog

主に競プロ、たまに自転車

Codeforces Round #667 div. 3 F - Subsequences of Length Two

この問題を自力 AC しました。バチャでは前の E に詰まって F まで見れませんでした、E に詰まったら F を見よう!の典型ができませんでした。

問題概要

文字列 s と長さ 2 の文字列 t、整数 k が与えられる。文字列 s の任意の要素を任意の文字に置き換える操作を k 回まで行うことができる。文字列 s の長さ 2 の部分列のうち、t と一致するものの数を最大化したときの値を答えよ。

考えたこと

前と後ろから何個変更するかを決め打ちしたらできませんか?
→う〜ん、厳しい。t_1t_0 に変えたいときの判定とかどうしたら良いかわからない。
とりあえず動的計画法で何回変えたか、t_0 の数、t_1 の数を保持しておけば \mathrm{O}(N^4) ではいけそう。遷移を考えると t_1 の数は要らなさそう。

解法

dp[i][j][k]:= i 番目まで見て、置き換えを j 回行い、t_0k 個あるときのスコアの最大値。として、動的計画法をすると \mathrm{O}(N^3) で解くことができます。詳しい遷移は提出コードを参考にしてください。


提出コード