Más contenido relacionado La actualidad más candente (20) Similar a 「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目) (20) Más de Kensuke Otsuki (10) 「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)7. 7
アルゴリズム本の章構成
第 1 章
アルゴリズムとは
第 2 章
計算量とオーダー記法
第 3 章
全探索
第 4 章
再帰と分割統治法
第 5 章
動的計画法
第 6 章
二分探索法
第 7 章
貪欲法
第 8 章
配列、連結リスト
ハッシュテーブル
第 9 章
スタックとキュー
第 10 章
グラフと木
第 11 章
Union-Find
第 12 章
ソート
第 13 章
グラフ探索
第 14 章
最短路問題
第 15 章
最小全域木問題
第 16 章
ネットワークフロー
第 17 章
P と NP
第 18 章
難問対策
8. 8
アルゴリズム本の章構成
第 1 章
アルゴリズムとは
第 2 章
計算量とオーダー記法
第 3 章
全探索
第 4 章
再帰と分割統治法
第 5 章
動的計画法
第 6 章
二分探索法
第 7 章
貪欲法
第 8 章
配列、連結リスト
ハッシュテーブル
第 9 章
スタックとキュー
第 10 章
グラフと木
第 11 章
Union-Find
第 12 章
ソート
第 13 章
グラフ探索
第 14 章
最短路問題
第 15 章
最小全域木問題
第 16 章
ネットワークフロー
第 17 章
P と NP
第 18 章
難問対策
28. • 数独ソルバー (by 深さ優先探索)
28
グラフを使って問題を解く例
• 迷路の最短路 (by 幅優先探索)
42. 42
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
43. 43
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
44. 44
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
45. 45
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
46. 46
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
47. 47
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3 1
48. 48
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3 1
49. 49
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 1 2
50. 50
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 1 2
51. 51
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 2
3
2
2
1
1
3
1 2 3
52. 52
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 2
3
2
2
1
1
3
1 2 3
53. 53
深さ優先探索の動き
• 矛盾するまで猛突猛進に突き進む / 矛盾したら戻る
2
3
2
2
1
1
1 2
3
2
2
1
1
2
3
2
2
1
1
3
2
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
1 2 3
2
3
2
2
1
1
1
2
3
2
2
1
1
1 2
3
2
2
1
1
1
2 2 3
1 2 3
2
3
2
2
1
1
2
3
2
2
1
1
3
2
3
2
2
1
1
3 2
3
2
2
1
1
3
1 2 3
終了!
76. 76
最短経路問題 - 実応用に向けて
• 道路の長さも考慮
• ダイクストラ法などより高度なアルゴリズムへ
• 道路の交通状況も考慮
• 「ここを通ると嬉しい」というボーナスも
• ベルマンフォード法などより高度なアルゴリズムへ
• 街の構造なども利用して高速化したり
79. 一般項
3, 6, 9, 12, 15, 18, 21, 24, …
例:
この数列を一般項としてみると…
n 番目は 3 × n 3, 6, 9, 12, 15, 18, 21, 24, …
3×1
an = 3n
79
80. 一般項
3, 6, 9, 12, 15, 18, 21, 24, …
例:
n 番目は 3 × n 3, 6, 9, 12, 15, 18, 21, 24, …
3×2
an = 3n
この数列を一般項としてみると…
80
81. 一般項
3, 6, 9, 12, 15, 18, 21, 24, …
例:
n 番目は 3 × n 3, 6, 9, 12, 15, 18, 21, 24, …
3×3
an = 3n
この数列を一般項としてみると…
81
82. 一般項
3, 6, 9, 12, 15, 18, 21, 24, …
例:
n 番目は 3 × n 3, 6, 9, 12, 15, 18, 21, 24, …
3×4
an = 3n
この数列を一般項としてみると…
82
84. 漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3,
漸化式としてみると…
84
前の数に
3 を足していく
an = an−1 + 3
85. 漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3, 6,
+3
漸化式としてみると…
85
前の数に
3 を足していく
an = an−1 + 3
86. 漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3, 6, 9,
+3 +3
漸化式としてみると…
86
前の数に
3 を足していく
an = an−1 + 3
87. 漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3, 6, 9, 12,
+3 +3 +3
漸化式としてみると…
87
前の数に
3 を足していく
an = an−1 + 3
88. 漸化式
前の数値から、次の数値を作る規則
3, 6, 9, 12, 15, 18, 21, 24, …
例:
a1 = 3
,
初項が 3
3, 6, 9, 12, 15, …
+3 +3 +3 +3
漸化式としてみると…
88
前の数に
3 を足していく
an = an−1 + 3
89. 三項間漸化式も
前の数値から、次の数値を作る規則
フィボナッチ数列
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
89
an = an−1 + an−2
a1 = 1
a2 = 1
95. 漸化式をグラフで表す
例:
95
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
96. 漸化式をグラフで表す
例:
96
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
6
97. 漸化式をグラフで表す
例:
97
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
6 9
98. 漸化式をグラフで表す
例:
98
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
6 9 12
99. 漸化式をグラフで表す
例:
99
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
6 9 12 15
100. 漸化式をグラフで表す
例:
100
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1
6 9 12 15
1
101. 漸化式をグラフで表す
例:
101
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1 1
6 9 12 15
2
102. 漸化式をグラフで表す
例:
102
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1 1
6 9 12 15
2 3
103. 漸化式をグラフで表す
例:
103
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1 1
6 9 12 15
2 3 5
104. 漸化式をグラフで表す
例:
104
3, 6, 9, 12, 15, 18, 21, 24, …
例:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, …
+3 +3 +3 +3 +3
3
an = an−1 + 3
an = an−1 + an−2
…
…
1 1
6 9 12 15
2 3 5 8
110. グラフの問題と考える
110
例:
0 1 2 3 4 5 6
7
2
5 1 4 5 4
4
3
1 9
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
・足場が 7 個
・(2, 9, 4, 5, 1, 6, 10)
111. 111
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 0 からノード 6 への最短経路を求める!
グラフの問題と考える
112. 112
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 0 からノード 6 への最短経路を求める!
• 答えは、2 + 1 + 1 + 4 = 8
グラフの問題と考える
114. 頂点 0 への最小コスト (初期条件)
114
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
メモ
121. 動的計画法とは
121
• 問題を一連の部分問題に分割
• 頂点 0 へ至る最小コストを求める問題
• 頂点 1 へ至る最小コストを求める問題
• …
• 頂点 N-1 へ至る最小コストを求める問題
• メモ化しながら、各部分問題の解を順に求めた
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
125. 拙著の動的計画法の章
• 5 章 - 設計技法 (3):動的計画法
125
• 5.1 動的計画法とは
• 5.2 動的計画法の例題
• 5.3 動的計画法に関連する諸概念
• 5.4 動的計画法の例 (1):ナップサック問題
• 5.5 動的計画法の例 (2):編集距離
• 5.6 動的計画法の例 (3):区間分割の仕方を最適化
• 5.7 まとめ
126. パターン(1):ナップサック問題
126
0 1 2 3 4 5 6 7 8 9 10
0 0 0 0 0 0 0 0 0 0 0
0 0 0 6 6 6 6 6 6 6 6
0 3 3 6 9 9 9 9 9 9 9
0 3 3 6 9 9 10
0 3 3 6 85
10 10 10 10
88 88 91 94 94 95
• こんなイメージの遷移
dp[0]
dp[1]
dp[2]
dp[3]
dp[4]
133. ナップサック DP の遷移
133
ナップサックに入れた重さ
0 1 2 3 4 5 6 7 8 9 10
0 個
1 個
2 個
3 個
4 個
0 0 0 0 0 0 0 0 0 0 0
0 0 0 6 6 6 6 6 6 6 6
0 3 3 6 9 9 9 9 9 9 9
0 3 3 6 9 9 10
0 3 3 6 85
10 10 10 10
88 88 91 94 94 95
• (重さ, 価値) = (3, 6), (1, 3), (2, 1), (5, 85) の場合
134. ナップサック DP の遷移のポイント
134
• N 個の要素をシーケンシャルに処理していくもの
• そのために必要な添字を適宜追加していく
dp[i][w]
部分問題のサイズ 遷移に必要な追加の添字
2 個
3 個
4 個
0 3 3 6 9 9 9 9 9 9 9
0 3 3 6 9 9 10
0 3 3 6 85
10 10 10 10
88 88 91 94 94 95
135. 例(1): サイゼリヤ問題
135
• 予算 1000 円で、最高何 kcal とれるか?
https://qiita.com/marusho_summers/items/a2d3681fac863734ec8a
• ナップサック問題そのもの
• ナップサックの容量が予算に対応:1000 円
• 品物の価値が、カロリーに対応
・ポテトのグリル
(199 円, 366 kcal)
・アーリオ•オーリオ
(574 円, 1120 kcal)
・ラージライス
(219 円, 454 kcal)
合計:992 円, 1940 kcal
141. 編集距離
141
2 つの文字列 S, T がある
S に以下の 3 通りの操作を繰り返すことで T に変換したい
・変更: S の文字を 1 つ選んで変更
・削除: S の文字を 1 つ選んで削除
・挿入: S の好きな箇所に好きな文字を 1 文字挿入
最小回数を求めよ
例:
S = logistic
T = algorithm
→ 6 回
142. 二系列の DP
142
例:
S = logistic
T = algorithm
→ 6 回
dp[i][j] ← S の最初の i 文字と、T の最初の j 文字との
間についての操作回数の最小値
144. 応用が広く、分野横断的!
144
• diff コマンド
• 音声認識、画像認識、空間認識
• DP マッチング
• 二系列データの類似度を考える問題全般に適用
• スペルチェッカー
• バイオインフォマティクス
• 系列アラインメント (2 つの DNA の類似度を測るなど)
• 手書き文字認識
146. 区間分割
146
0 1 2 3 4 5 6 7 8 9
• 系列データをいくつかの区間に分ける
• 区間分割の仕方を最適化したい
148. 区間分割を扱う DP
148
i 個
j 個
計算量は大きくなりがち
さまざまな高速化手法あり
dp[i] = min_{j = 0, 1, …, i-1}(dp[j] + f(j, i))
dp[j] dp[i]
150. 例(5): 発電計画問題
150
• 発電の on と off のタイミングを最適化する
on off on off
• 需要供給バランスの考慮などもあって、各区間のコス
ト関数 f(i, j) はとても複雑なものになる
• 「~時間以上連続稼働」といった制約も考慮