Upgrade to Pro — share decks privately, control downloads, hide ads and more …

競プロに出てきそうなアルゴリズム part3

競プロに出てきそうなアルゴリズム part3

More Decks by NearMeの技術発表資料です

Other Decks in Programming

Transcript

  1. 2 動的計画法とは • 問題が持つべき性質 • 部分構造最適性 • 与えられた最適化問題の解が、その部分問題の最適解の組み合わせによって得られるこ と。 •

    部分問題重複性 • 問題が複数回再利用される部分問題に分割される時、問題の再帰アルゴリズムが同じ部分 問題を生成する時など • 適用される問題例 • ナップサック問題 • スケジューリング問題 • 音声認識パターンマッチング問題 • 隠れマルコフモデル 2
  2. 3 動的計画法の例題 ❏ 問題 ❏ 図のようにN個の足場があり、i番目の足場の高さがh i で与えられる。 そして①,②のいずれかの行動を繰り返してN-1番目の足場を目指す。 ①足場iから足場i+1へと移動する(コストは|h

    i - h i+1 |) ②足場iから足場i+2へと移動する(コストは|h i - h i+2 |) この時N-1番目の足場に到達するときにかかるコストの総和の最小値を求めよ。 3 7 5 2 8 4 1 i=0 i=1 i=2 i=3 i=4 i=5
  3. 4 動的計画法の例題 頂点5に到達するのにかかる最小コストを求めるために、問題を分割していく。 例:dp[ i ]は頂点iに到達するまでにかかる最小コストとする。 dp[ i ] =

    min(dp[ i - 1 ] + |h i - h i-1 |, dp[ i - 2 ] + |h i - h i-2 |) dp[0] = 0, dp[1] = |7-1| = 6, dp[2] = min(dp[0] + |5-1|, dp[1] + |5-7|) 4 7 5 2 8 4 1 i=0 i=1 i=2 i=3 i=4 i=5 頂点5に到達するのに かかる最小コストを求 める 頂点3に到達するのに かかる最小コストを求め る 頂点4に到達するのに かかる最小コストを求め る = +
  4. 5 動的計画法の例題 dp[2] = min(dp[0] + cost, dp[1] + cost)のようにこの配列dpを更新していき、最終的にdp[5]が求まる。

    このように値を更新していくことを「緩和」というらしい。 この「緩和」はベルマン・フォード法やダイクストラ法などでも使われる概念。 5 7 5 2 8 4 1 i=0 i=1 i=2 i=3 i=4 i=5 0 6 Inf Inf Inf Inf 配列 dp
  5. 6 動的計画法に関する概念 6 5 4 3 3 2 1 2

    2 1 0 1 0 1 0 1 • トップダウン方式 ◦ 問題を部分問題に分解していき、解をメモしながら解いていく。 • ボトムアップ方式 ◦ 前ページの配列dpをdp[0]から埋めていくイメージ