ARC002 C問題:コマンド入力

問題. コマンド入力

A, B, X, Y の 4種類からなる長さ  N のコマンド列  s が与えられる.長さ 2 の 2 種類のショートカットキー L と R を設定することによって, s の連続する 2 つのコマンドで L または R に一致するものを L または R に置き換えることができる.ショートカットキーを上手く設定することによって  s の長さを最小にせよ.

制約 1 \le N \le 1,000

解法1.動的計画法

ショートカットキー L と R は A, B, X, Y の4種類から重複を許して 2 つを選び一列に並べたものなので高々  4^4 = 256 通りしかない.したがって,すべての L と R の割り当て方に対してコマンド列を最小にする置き換え方を求めることを考える.

現在 L と R はある値に固定されているとする.L と R を適切に置き換えることによって  s の長さを最小にするために動的計画法を用いる.dp[i] を部分コマンド列  s_1 s_2 \ldots s_i に対してショートカットキーを割り当てたときの長さの最小値とする.遷移方法はソースコードを参照.

計算時間 O(M^4 N) \, M はコマンドに現れる文字列の種類数)

解法2.貪欲法

解法1の L と R が固定されているときに,上手く割り当てる方法を次のように貪欲的に選択する.
 s_1 s_2 \cdots s_{i - 1} まで割り当てが済んでいるとする. s_i s_{i + 1} が L または R に等しい場合は  s_i s_{i + 1} を L または R に置き換えて  s_{i + 2} \cdots s_{N} を考える.等しくない場合は  s_i はそのままにして  s_{i + 1} \cdots s_{N} を考える.これをすべてのコマンド列を置き換えるまで貪欲的に行う.

TODO:AC はしたが未証明なので証明を行う

計算時間 O(M^4 N) \, M はコマンドに現れる文字列の種類数)

貪欲法の証明は難しいことが多いので,出来ない場合はペナルティーが怖くなければ投げて,それ以外の証明が簡単な方法(動的計画法)が思いつけばそれを実装する.