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