E - 荷物の積み込み / Loading Cargo 解説 by kyopro_friends

DP高速化の方針

公式解説と同様の考察により予め \(W+D\) の昇順にソートしてよいです。

\(O(N^2)\) 解法

\(\mathrm{DP}[i][j]\) = \(i\) 番目段ボール箱までで \(j\) 個積み上げるときの重さの合計最小値(不可能なら \(\infty\)

\(O(N\log N)\) 解法

\(\mathrm{DP}[i]\) で、列 \((\mathrm{DP}[i][0],\mathrm{DP}[i][1],\mathrm{DP}[i][2],\dots)\) を表すことにします。

以下の \(3\) 点を証明します。

  • \(\mathrm{DP}[i]\)\(j\) の列として単調増加である
  • \(\mathrm{DP}[i]\) の階差は広義単調増加である
  • \(\mathrm{DP}[i+1]\) の階差は \(\mathrm{DP}[i]\) の階差に、順序を保って \(W\) を挿入したものか、それから \(\infty\) でない末尾要素を削除したものである。

\(i\) に関する帰納法によります。 3 点目が示せれば 1,2 点目明らかなので、3 点目のみ示します。

\(i=0\) のときの成立は明らかです。\(i\geq 1\) のときを考えます。

\(k\)\(\mathrm{DP}[i][k]\)\(\infty\) ではない最大の整数とします。\(k\geq 1\) が成り立ちます。また、 \(W_{i+1}, D_{i+1}\) を単に \(W,D\) と書きます。

\(O(N^2)\) 解法における DP テーブルの更新式 if(dp[i][j-1] <= D) dp[i+1][j] = min(dp[i][j], dp[i][j-1] + W) を思い浮かべながら、次の 3 つのケースに分けて考えます。

  • \(\mathrm{DP}[i][k]\leq D\) のとき
    このとき、 DP テーブル更新式の if 文の条件に全ての \(j\) が該当するため、全ての \(j\) で更新が行われ、結果として階差には \(W\) が挿入されます。
  • \(\mathrm{DP}[i][k]>D\) かつ \(\mathrm{DP}[i][k]-\mathrm{DP}[i][k-1]<W\) のとき
    DPテーブルが更新される箇所はありません。これは「階差の列に \(W\) を順序を保って(末尾に)挿入し、末尾要素を削除する」と同じです。
  • \(\mathrm{DP}[i][k]>D\) かつ \(\mathrm{DP}[i][k]-\mathrm{DP}[i][k-1]\geq W\) のとき
    \(W+D\) の昇順に考えていることから、 \(\mathrm{DP}[i][k] \leq W+D\) であることに注意すると、\(\mathrm{DP}[i][k-1]\leq DP[i][k]-W \leq (D+W)-W \leq D\) なので、 \(j \leq k\) では DP テーブル更新式の if 文の条件を満たし、結果として「階差の列に \(W\) を挿入して末尾要素を削除する」となります。

よって、 DP テーブルや \(\mathrm{DP}[i]\) そのものを持つ代わりにその階差の多重集合と \(\mathrm{DP}[i][k]\) 即ち階差の総和を保持することで \(O(N\log N)\) でこの問題を解くことができます。

投稿日時:
最終更新: