C - Illuminate Buildings Editorial by seekworser


動的計画法を用いてこの問題を解くことができます。

\(dp_{i, j} = \)(数列の先頭が \(i\) 番目で、間隔が \(j\) であるときの最長の数列の長さ)とします。このように定義すると

\[ dp _{i+j, j} = \begin{cases} dp_{i, j} + 1 \quad (\mathrm{if} \ H_{i+j} = H_i)\\ 1 \quad (\mathrm{otherwise}) \end{cases} \]

のように遷移できます。状態数が \(O(N^2)\) 、遷移が \(O(1)\) なので全体で時間計算量は \(O(N^2)\) となります。

実装例(C++)

posted:
last update: