G - Approximate Equalization Editorial
by
kyopro_friends
本質的には公式解説と同じです。
目標とする条件は \(2\) 数の差のみによるので、全ての \(A_i\) に定数を加えても答えは変化しません。そこで、全体に適当な値を加えることで \(0\leq \sum_i A_i <N\) であるとして良いです。
目標とする条件「全ての \((i,j)\) で \(|A_i-A_j|\leq 1\)」は、「\(A_i\) の値は高々 \(2\) 種類であり、\(2\) 種類ならその差は \(1\) である」と同値です。したがって、\(0\leq \sum_i A_i <N\) のとき、各 \(A_i\) は \(0\) または \(1\) に変化させることになります。
累積和 \(S_i=\sum_{k=0}^{i-1}A_k\) ( ただし、\(S_0=0\) ) を考えると、操作は「\(1\leq i <N \) を \(1\) つ選び、\(S_i\) の値を \(1\) 増やす、または \(1\) 減らす」となります。
以上から問題は次のように読み替えられます:
長さ \(N+1\) の数列 \((S_0,\ldots,S_N)\) が与えられる。\(S_0=0\)、\(0\leq S_N <N\) である。「\(1\leq i <N \) を \(1\) つ選び、\(S_i\) の値を \(1\) 増やす、または \(1\) 減らす」を行って、全ての \(i\) で \(S_{i+1}-S_i\) が \(0\) または \(1\) となるようにするための最小回数を求めよ。
任意の \(i\) で、操作後の \(S_i\) の取りうる値が \(0\) 以上 \(N\) 未満であることから、これは
\(\mathrm{DP}[i][j]=\) \(S_i\) まで条件を満たすように操作を行って、\(S_i=j\) であるようにするための操作回数の最小値
とするDPで求めることができます。
状態数 \(O(N^2)\) 遷移 \(O(1)\) であることから、計算量は全体で \(O(N^2)\) となります。
posted:
last update:
