お題箱より。
解法
計算量などの表記のため、 と置きます。この問題の制約では
です。
作りたいレベル のJOI文字列を
と表記します。文字列のインデックスは0-indexedで表記します。
を前から順に作っていく、以下のようなDPを考えます。
文字列
のうち先頭の
文字(つまり
文字目)を作るのに必要な最小コスト
の文字数が
なので、
が答えです。
からの遷移として、次に購入する文字列
を全て試すことにします。このときの遷移先、すなわち
を購入することで
をどこまで進められるかを計算したいです。そのためには
の文字を順に見ていきながら、
の続きの文字と一致すればその文字を採用して
を1文字進める、ということを繰り返せば良いです。
1つの からの遷移で各
の全ての文字を見ることになるので、このDPを回すと全体計算量
で答えを求められます。ちょっと心もとないですね。もう少し高速化しましょう。
実際には文字列 は、ほとんどの箇所で同じ文字が続きます。
からの遷移を考える時、例えば
の
文字目から
文字目まで全部
J
であったとします。このとき を1回購入することで
J
ゾーンから脱出することはできないので、単に「各 に含まれる
J
の個数」ぶんだけ進むことになり、 を1文字ずつ見なくても一発で遷移先が計算できます。
O
や I
についても同様です。
ほとんどのインデックスではこのような遷移計算が可能であり、1つの からの遷移が
で計算できます。そしてこのような遷移計算ができないところ、つまり
のインデックスのうち
文字先までの間に異なる文字が存在するところは高々
箇所です。これら2つの遷移を使い分けることで全体計算量は
となり、間に合います。