E - Simple Speed Editorial by PCTprobability
[1]動的計画法の利用
隣り合う要素の差の絶対値が全て \(1\) である数列(長さ \(1\) も含む)を「素晴らしい整数列」と呼ぶこととします。
\(\mathrm{dp}[i][j][k]:=i\) 以下の値のみを使い「素晴らしい整数列」の列 \(C_1,C_2,\dots,C_j\) を作る方法の個数。ただし、以下の条件を全て満たす必要がある。
- $2 \le l \le j$ を満たす整数 $l$ に対し、$C_l$ の先頭は $i$ である。
- $1 \le l \le j-1$ を満たす整数 $l$ に対し、$C_l$ の末尾は $i$ である。
- $C_1$ の先頭、$C_j$ の末尾のうち、$k$ 個が $i-1$ 以下である。
上記の動的計画法を考えます。つまり、\(B\) から \(i\) 以下の値のみを取り出したときにあり得る列の列の個数です。例えば、\((2,3,2,1,2,3,4,3,4,3,2,3)\) という「素晴らしい整数列」は以下の \(4\) 箇所の \(\mathrm{dp}\) 配列を通ります。
- \((1)\) \((\mathrm{dp}[1][1][0])\)
- \((2),(2,1,2),(2)\) \((\mathrm{dp}[2][3][0])\)
- \((2,3,2,1,2,3),(3),(3,2,3)\) \((\mathrm{dp}[3][3][1])\)
- \((2,3,2,1,2,3,4,3,4,3,2,3)\) \((\mathrm{dp}[4][1][1])\)
\(\begin{cases} \mathrm{dp}[i+1][A_{i+1}-j][0] = \mathrm{dp}[i][j][0] \times \binom{A_{i+1}-1}{j} \\ \mathrm{dp}[i+1][A_{i+1}-j+1][1] = \mathrm{dp}[i][j][0] \times 2 \times \binom{A_{i+1}-1}{j-1} \\ \mathrm{dp}[i+1][A_{i+1}-j+2][2] = \mathrm{dp}[i][j][0] \times \binom{A_{i+1}-1}{j-2} \end{cases}\)
\(\begin{cases} \mathrm{dp}[i+1][A_{i+1}-j+1][1] = \mathrm{dp}[i][j][1] \times \binom{A_{i+1}-1}{j-1} \\ \mathrm{dp}[i+1][A_{i+1}-j+2][2] = \mathrm{dp}[i][j][1] \times \binom{A_{i+1}-1}{j-2} \end{cases}\)
\(\begin{cases} \mathrm{dp}[i+1][A_{i+1}-j+2][2] = \mathrm{dp}[i][j][2] \times \binom{A_{i+1}-1}{j-2} \end{cases}\)
[2]計算量
上記の動的計画法で、全ての \((i,j,k)\) を持ってしまうと計算量が \(\mathrm{O}(N \times \max A)\) となってしまいます。\(\mathrm{dp}[i][j][k] \neq 0\) となる \((i,j,k)\) だけを持つことにより計算量を削減することを考えます。
\((i,k)\) を固定した場合の \(\mathrm{dp}[i][j][k] \neq 0\) となるような \(j\) の値について調べます。簡素化のため、\(X_i = A_i - A_{i-1} + A_{i-2} - A_{i-3} + \dots\) とします。
\(\begin{array}{c|ccccc} & 0 & 1 & 2\\ \hline 1 & X_1 & & \\ \hline 2 & X_2 & X_2+1 & X_2+2 \\ \hline 3 & X_3 & X_3,X_3+1 & X_3,X_3+1,X_3+2 \\ \hline 4 & X_4 & X_4,X_4+1 & X_4,X_4+1,X_4+2 \end{array}\)
上記からわかるように、\(\mathrm{dp}[i][j][k] \neq 0\) であるような \((i,j,k)\) の個数は \(\mathrm{O}(N)\) となります。
[3]まとめ
よって、この問題を \(\mathrm{O}(N + \max A)\) で解くことができます。連想配列などを使うことにより、実装を簡潔にすることができます。
posted:
last update: