動的計画法DPとは?小さい問題の答えをメモして使い回し

公開: 更新: カテゴリ: テクノロジ系

30秒で結論

動的計画法(DP)とは(全体像)

動的計画法は、「大きな問題を小さな問題に分け、小さな問題の答えをメモして使い回す」ことで、むだな計算を消す手法。アルゴリズムの強力な道具の1つだ。

たとえばフィボナッチ数列を素朴に再帰で計算すると、同じ計算を何度も繰り返して爆発的に遅くなる(O(2^n))。一度計算した答えをメモしておけば、繰り返しが消えてO(n)まで速くなる——これがDPの効果だ。

ただし、どんな問題でも使えるわけではなく、2つの条件がそろう必要がある。


詳しく:2要件と2方式だけ覚えれば戦える

ここが記事の心臓部。まずはDPが使える2つの条件

DPが使える2要件

要件内容
最適部分構造全体の最適解=部分の最適解の組み合わせ
部分問題の重複同じ小さな問題が何度も出てくる

この2つがそろって初めてDPが効く。「どんな問題でもDPで解ける」わけではない、というのが大事な注意点だ。

次に、実装の2方式

DPの実装2方式

方式やり方
トップダウン(メモ化再帰)再帰で解きつつ、計算した答えをメモして使い回す
ボトムアップ(表埋め)小さい問題から順に表を埋めていく(繰り返し)

トップダウンは、再帰で大きい問題から下りつつ、途中の答えをメモする(直感的)。ボトムアップは、いちばん小さい問題から表を順に埋めていく(メモリ効率がよい)。どちらも「答えを使い回す」点は同じだ。つまり、上から下りるか下から積むかの違いで、メモして使い回す核心は変わらない、というわけだね。

なお、「DP=メモ化」ではない。メモ化はDPの実装方式(トップダウン)の1つで、DPはもっと広い考え方だ。代表的なDPの問題には、フィボナッチ、ナップサック問題(限られた容量で価値を最大に)、最長共通部分列(2つの文字列の共通部分)などがある。

わかりやすく言い換えると

要するに、DPは「一度解いた小問題の答えをメモ帳に書いて使い回す」ことだ。

メモなし … フィボナッチを素朴に計算すると、同じ小問題を何度も解き直して大渋滞(O(2^n))

メモあり(DP) … 一度解いた答えをメモに書き、次からはメモを見るだけ。むだな解き直しが消える(O(n))

実装は、上から下りてメモする「トップダウン」と、下から表を埋める「ボトムアップ」の2通り。どちらも「同じ計算を二度しない」のが核心、というわけだね。


試験のツボ

🔴 一番出る:DPが使える2要件

①最適部分構造(全体最適=部分最適の組み合わせ)

②部分問題の重複(同じ計算が何度も出てくる)

🔴 次に出る:実装2方式

①トップダウン=メモ化再帰(再帰しつつメモ)

②ボトムアップ=表埋め(小さい問題から順に)

🟡 押さえると安定:効果と代表例

①フィボナッチがO(2^n)からO(n)に速くなる

②ナップサック問題・最長共通部分列などが代表


よくある間違い

「動的計画法はメモ化とまったく同じものである」→ ✗  メモ化はDPの実装方式(トップダウン)の1つ。DPはもっと広い考え方。

「どんな問題でも動的計画法で解ける」→ ✗  最適部分構造と部分問題の重複の2要件がそろう必要がある。

「動的計画法はむだな計算を増やして遅くする手法である」→ ✗  むだな計算を使い回して減らし、速くする手法(フィボナッチはO(2^n)→O(n))。


試験での出題パターン

実際の問題でたしかめてみよう。

オリジナル問題1(DPの効果)

📝 オリジナル問題 1 DPの効果

動的計画法(DP)の効果に関する次の記述のうち、正しいものはどれか。

  1. 小問題の答えを使い回し、フィボナッチをO(2^n)からO(n)に速くする
  2. 小問題の答えを毎回捨てるため、計算量はかえってO(2^n)に増えてしまう
  3. 動的計画法はデータを並べ替えるだけの手法で、計算の高速化とは無関係だ
  4. 動的計画法はメモを一切使わず、同じ計算を何度も繰り返す手法のことである
オーエスペン
オーエスペン 解答・解説

解答は 1 だよ。

DPは小問題の答えをメモして使い回すことで、むだな計算を消すんだ。素朴な再帰だとO(2^n)で爆発するフィボナッチが、DPでO(n)まで速くなるよ。

選択肢2は「毎回捨てる・増える」が誤り。選択肢3は「並べ替えるだけ」が誤り。選択肢4は「メモを使わず繰り返す」が誤りだよ。

選択肢判定理由
1メモして使い回しO(2^n)→O(n)
2捨てずに使い回す
3計算の高速化に関わる
4メモして繰り返しを消す

オリジナル問題2(2方式)

📝 オリジナル問題 2 DPの実装方式

動的計画法の実装方式に関する次の記述のうち、正しいものはどれか。

  1. 実装はトップダウンの1方式だけで、表を埋めるやり方は存在しないものである
  2. 実装はボトムアップの1方式だけで、再帰を使うやり方は存在しないものだ
  3. トップダウン(メモ化再帰)とボトムアップ(表埋め)という2方式がある
  4. 実装方式はDPごとにランダムで、決まったやり方はないものとされている
オーエスペン
オーエスペン 解答・解説

解答は 3 だよ。

DPの実装にはトップダウン(メモ化再帰)とボトムアップ(表埋め)の2方式があるんだ。上から下りてメモするか、下から表を埋めるかの違いだね。

選択肢1・2は「1方式だけ」が誤り。選択肢4は「ランダム」が誤りだよ。

選択肢判定理由
1ボトムアップもある
2トップダウンもある
3トップダウンとボトムアップの2方式
4決まった2方式がある

オリジナル問題3(適用条件)

📝 オリジナル問題 3 DPの適用条件

動的計画法が使える条件に関する次の記述のうち、正しいものはどれか。

  1. どんな問題でも動的計画法で必ず解ける、万能の手法であるとされている
  2. 最適部分構造と部分問題の重複の2つがそろうと、動的計画法がよく効く
  3. 部分問題がいっさい重複しない問題ほど、動的計画法の効果が大きくなる
  4. 動的計画法はメモ化と同じもので、適用できる条件はとくにないものである
オーエスペン
オーエスペン 解答・解説

解答は 2 だよ。

DPは最適部分構造(全体最適=部分最適の組み合わせ)と部分問題の重複(同じ計算が何度も)の2つがそろうと効くんだ。どんな問題でも使えるわけではないよ。

選択肢1は「どんな問題でも・万能」が誤り。選択肢3は「重複しないほど効果大」が逆。選択肢4は「メモ化と同じ・条件なし」が誤りだよ。

選択肢判定理由
12要件が必要で万能ではない
2最適部分構造+部分問題の重複
3重複があるほど効く
42要件という条件がある

まとめ

押さえどころ

次に学ぶ


執筆: SikakuQuest編集部

勉強は、クエストになった。

資格の勉強を、冒険に変えるRPG学習アプリ

App Storeで見る