More Related Content
Similar to 競プロは人生の役に立つ! (10)
More from Kensuke Otsuki (12)
競プロは人生の役に立つ!
- 10. 10
ICPC も楽しい!
• 3 人 1 組のチーム戦!!!
https://www.slideshare.net/iwiwi/wakate-web-14323842
• 競プロサークルのある大学もたくさん!
• 合宿やコンテストの開催側にもなれる!
- 24. 24
実務で使ったアルゴリズムたち
• DP (動的計画法)
• ナップサック DP
• 区間 DP
• O(3^N) の bit DP
• セグメント木
• 遅延評価つきセグメント木
• セグメント木上の DP
• フロー
• 二部マッチング
• ABC-G でもありそうな最大フロー問題
• ヒューリスティクス系
• 焼きなましやビームサーチ
• 負閉路があるかもしれない最短路問題
- 25. 25
実務で使ったアルゴリズムたち
• DP (動的計画法)
• ナップサック DP
• 区間 DP
• O(3^N) の bit DP
• セグメント木
• 遅延評価つきセグメント木
• セグメント木上の DP
• フロー
• 二部マッチング
• ABC-G でもありそうな最大フロー問題
• ヒューリスティクス系
• 焼きなましやビームサーチ
• 負閉路つきの最短路問題
- 31. グラフの問題と考える
31
例:
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)
/ 133
- 34. 34
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 0 からノード 6 への最短経路を求める!
グラフの問題と考える
/ 133
- 35. 35
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
グラフの問題と考える
/ 133
- 36. 問題を次のように分解する
36
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める小問題
• ノード 2 へ至る最小コストを求める小問題
• ノード 3 へ至る最小コストを求める小問題
• ノード 4 へ至る最小コストを求める小問題
• ノード 5 へ至る最小コストを求める小問題
• ノード 6 へ至る最小コストを求める小問題 / 133
- 37. 問題を次のように分解する
37
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める小問題
• ノード 2 へ至る最小コストを求める小問題
• ノード 3 へ至る最小コストを求める小問題
• ノード 4 へ至る最小コストを求める小問題
• ノード 5 へ至る最小コストを求める小問題
• ノード 6 へ至る最小コストを求める小問題 / 133
- 38. 問題を次のように分解する
38
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める小問題
• ノード 2 へ至る最小コストを求める小問題
• ノード 3 へ至る最小コストを求める小問題
• ノード 4 へ至る最小コストを求める小問題
• ノード 5 へ至る最小コストを求める小問題
• ノード 6 へ至る最小コストを求める小問題 / 133
- 39. 問題を次のように分解する
39
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める小問題
• ノード 2 へ至る最小コストを求める小問題
• ノード 3 へ至る最小コストを求める小問題
• ノード 4 へ至る最小コストを求める小問題
• ノード 5 へ至る最小コストを求める小問題
• ノード 6 へ至る最小コストを求める小問題 / 133
- 40. 問題を次のように分解する
40
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める小問題
• ノード 2 へ至る最小コストを求める小問題
• ノード 3 へ至る最小コストを求める小問題
• ノード 4 へ至る最小コストを求める小問題
• ノード 5 へ至る最小コストを求める小問題
• ノード 6 へ至る最小コストを求める小問題 / 133
- 41. 問題を次のように分解する
41
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める小問題
• ノード 2 へ至る最小コストを求める小問題
• ノード 3 へ至る最小コストを求める小問題
• ノード 4 へ至る最小コストを求める小問題
• ノード 5 へ至る最小コストを求める小問題
• ノード 6 へ至る最小コストを求める小問題 / 133
- 42. 問題を次のように分解する
42
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 1 へ至る最小コストを求める小問題
• ノード 2 へ至る最小コストを求める小問題
• ノード 3 へ至る最小コストを求める小問題
• ノード 4 へ至る最小コストを求める小問題
• ノード 5 へ至る最小コストを求める小問題
• ノード 6 へ至る最小コストを求める小問題 / 133
- 44. 頂点 0 への最小コスト (初期条件)
44
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
メモ
/ 133
- 51. 実装上は
51
• メモ化用の DP テーブルを配列でもつ
dp[v] ← 頂点 0 から頂点 v へ至る最短コスト
i-2 i-1 i
dp[i] = min(dp[i-1] + f(i-1, i),
dp[i-2] + f(i-2, i)
/ 133
- 54. 54
大きさが A[0], A[1], …, A[N-1] のオレンジがある
0 1 2 3 4 5 6 7 8 9
前から順に、箱に詰めていく
各箱のコストは、
「K + (箱内の A の最大値 - 箱内の A の最小値) × 個数」
各箱のコストの総和を最小化せよ
3 5 4 9 11 8 10 1 7 8
K = 5
/ 133
JOI の問題:オレンジの出荷 (改)
JOI 本選 2016 A 問題
- 55. 55
JOI 本選 2016 A 問題
大きさが A[0], A[1], …, A[N-1] のオレンジがある
0 1 2 3 4 5 6 7 8 9
前から順に、箱に詰めていく
各箱のコストは、
「K + (箱内の A の最大値 - 箱内の A の最小値) × 個数」
各箱のコストの総和を最小化せよ
3 5 4 9 11 8 10 1
K = 5
7 8
基本コスト
/ 133
JOI の問題:オレンジの出荷 (改)
- 56. 56
JOI 本選 2016 A 問題
大きさが A[0], A[1], …, A[N-1] のオレンジがある
0 1 2 3 4 5 6 7 8 9
前から順に、箱に詰めていく
各箱のコストの総和を最小化せよ
3 5 4 9 11 8 10 1 7 8
K = 5
例
各箱のコストは、
「K + (箱内の A の最大値 - 箱内の A の最小値) × 個数」
/ 133
JOI の問題:オレンジの出荷 (改)
- 57. 57
JOI 本選 2016 A 問題
大きさが A[0], A[1], …, A[N-1] のオレンジがある
0 1 2 3 4 5 6 7 8 9
前から順に、箱に詰めていく
各箱のコストの総和を最小化せよ
3 5 4 9 11 8 10 1 7 8
K = 5
例
各箱のコストは、
「K + (箱内の A の最大値 - 箱内の A の最小値) × 個数」
5 + (9 - 3) × 4
= 29
5 + (11 - 8) × 3
= 14 5
5 + (8 - 7) × 2
= 7
/ 133
JOI の問題:オレンジの出荷 (改)
- 58. 58
JOI 本選 2016 A 問題
大きさが A[0], A[1], …, A[N-1] のオレンジがある
0 1 2 3 4 5 6 7 8 9
前から順に、箱に詰めていく
各箱のコストの総和を最小化せよ
3 5 4 9 11 8 10 1 7 8
K = 5
例
各箱のコストは、
「K + (箱内の A の最大値 - 箱内の A の最小値) × 個数」
5 + (9 - 3) × 4
= 29
5 + (11 - 8) × 3
= 14 5
5 + (8 - 7) × 2
= 7
コスト: 55
/ 133
JOI の問題:オレンジの出荷 (改)
- 59. 59
JOI 本選 2016 A 問題
0 1 2 3 4 5 6 7 8 9
3 5 4 9 11 8 10 1 7 8
K = 5
• Frog 問題と同様に「前から何個かのオレンジ」に
ついての小問題に分割していく
/ 133
JOI の問題:オレンジの出荷 (改)
- 60. 60
JOI 本選 2016 A 問題
0 1 2 3 4 5 6 7 8 9
3 5 4 9 11 8 10 1 7 8
K = 5
• Frog 問題と同様に「前から何個かのオレンジ」に
ついての小問題に分割していく
• メモ化用の配列を用意する
/ 133
JOI の問題:オレンジの出荷 (改)
- 61. 61
JOI 本選 2016 A 問題
0 1 2 3 4 5 6
3 5 4 9 11 8 10
K = 5
• Frog 問題と同様に「前から何個かのオレンジ」に
ついての小問題に分割していく
• メモ化用の配列を用意する
たとえばこのマスには
前から 7 個のオレンジ
についての答えを格納
/ 133
JOI の問題:オレンジの出荷 (改)
- 62. 62
JOI 本選 2016 A 問題
0 1 2 3 4 5 6 7 8 9
3 5 4 9 11 8 10 1 7 8
K = 5
• 前から 0 個のオレンジについての答えは 0
0
/ 133
JOI の問題:オレンジの出荷 (改)
- 64. 64
前から 1 個
0
3
K = 5
• 前から 1 個のオレンジについての答えは 5
0 5
+5
1
1 個のオレンジ {3}
を箱詰めするコストは 5
/ 133
- 68. 68
前から 2 個について考える
0
3
K = 5
• 最後の箱が {3, 5} のとき:コストは 0 + 9 = 9
0 5
1
5
• 最後の箱が {5} のとき:コストは 5 + 5 = 10
9
+9
/ 133
- 69. 69
前から 3 個について考える
K = 5
0 5 9
0 1 2
3 5 4
• 最後の箱をどうするかで場合分けして考える
• 最後の箱が {3, 5, 4} である場合
• 最後の箱が {5, 4} である場合
• 最後の箱が {4} である場合
/ 133
- 71. 71
前から 3 個について考える
K = 5
• 最後の箱が {3, 5, 4} のとき:コストは 0 + 11 = 11
0 5 9
0 1 2
3 5 4
• 最後の箱が {5, 4} のとき:コストは 5 + 7 = 12
+7
/ 133
- 72. 72
前から 3 個について考える
K = 5
0 5 9
0 1 2
3 5 4
+5
• 最後の箱が {3, 5, 4} のとき:コストは 0 + 11 = 11
• 最後の箱が {5, 4} のとき:コストは 5 + 7 = 12
• 最後の箱が {4} のとき:コストは 9 + 5 = 14
/ 133
- 73. 73
前から 3 個について考える
K = 5
0 5 9
0 1 2
3 5 4
• 最後の箱が {3, 5, 4} のとき:コストは 0 + 11 = 11
• 最後の箱が {5, 4} のとき:コストは 5 + 7 = 12
• 最後の箱が {4} のとき:コストは 5 + 7 = 14
11
+11
/ 133
- 74. 74
前から 4 個について考える
K = 5
0 5 9
0 1 2
3 5 4
• 最後の箱をどうするかで場合分けして考える
• 最後の箱が {3, 5, 4, 9} である場合
• 最後の箱が {5, 4, 9} である場合
• 最後の箱が {4, 9} である場合
3
9
11
• 最後の箱が {9} である場合
/ 133
- 75. 75
前から 4 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11
+29
• 最後の箱が {3, 5, 4, 9} のとき:コストは 0 + 29 = 29
/ 133
- 76. 76
前から 4 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11
• 最後の箱が {3, 5, 4, 9} のとき:コストは 0 + 29 = 29
+20
• 最後の箱が {5, 4, 9} のとき:コストは 5 + 20 = 25
/ 133
- 77. 77
前から 4 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11
• 最後の箱が {3, 5, 4, 9} のとき:コストは 0 + 29 = 29
• 最後の箱が {5, 4, 9} のとき:コストは 5 + 20 = 25
+15
• 最後の箱が {4, 9} のとき:コストは 9 + 15 = 24
/ 133
- 78. 78
前から 4 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11
• 最後の箱が {3, 5, 4, 9} のとき:コストは 0 + 29 = 29
• 最後の箱が {5, 4, 9} のとき:コストは 5 + 20 = 25
• 最後の箱が {4, 9} のとき:コストは 9 + 15 = 24
+5
• 最後の箱が {9} のとき:コストは 11 + 5 = 16
/ 133
- 79. 79
前から 4 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11
• 最後の箱が {3, 5, 4, 9} のとき:コストは 0 + 29 = 29
• 最後の箱が {5, 4, 9} のとき:コストは 5 + 20 = 25
• 最後の箱が {4, 9} のとき:コストは 9 + 15 = 24
• 最後の箱が {9} のとき:コストは 11 + 5 = 16
16
+5
/ 133
- 81. 81
前から 5 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
• 最後の箱が {9, 11} のとき最適:コストは 11 + 9 = 20
+9
20
/ 133
- 83. 83
前から 6 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20
5
8
• 最後の箱が {8} のとき最適:コストは 20 + 5 = 25
25
+5
/ 133
- 85. 85
前から 7 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20 25
5 6
8 10
• 最後の箱が {9, 11, 8, 10} のとき最適:コストは 11 + 17 = 28
+17
28
/ 133
- 87. 87
前から 8 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20 25
5 6
8 10
28
7
1
• 最後の箱が {1} のとき最適:コストは 28 + 5 = 33
+5
33
/ 133
- 88. 88
前から 9 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20 25
5 6
8 10
28
7
1
33
8
7
/ 133
- 89. 89
前から 9 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20 25
5 6
8 10
28
7
1
33
8
7
• 最後の箱が {7} のとき最適:コストは 33 + 5 = 38
+5
38
/ 133
- 90. 90
前から 10 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20 25
5 6
8 10
28
7
1
33
8
7
38
9
8
/ 133
- 91. 91
前から 10 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20 25
5 6
8 10
28
7
1
33
8
7
38
9
8
• 最後の箱が {7, 8} のとき最適:コストは 33 + 7 = 40
40
+7
/ 133
- 92. 92
最適解
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20 25
5 6
8 10
28
7
1
33
8
7
38
9
8
40
/ 133
- 93. 93
オレンジの出荷は「区間分割」
0 1 2 3 4 5 6 7 8 9
• 系列データをいくつかの区間に分ける問題に一般化
• 区間分割の仕方を最適化する
• さまざまな分野の問題が、区間分割問題へと帰着される
/ 133
- 96. 96
• 発電の on と off のタイミングを最適化する
on off on off
• 需要供給バランスの考慮などもあって、各区間のコス
ト関数 f(i, j) はとても複雑なものになる
• 「〜時間以上連続稼働」といった制約も考慮
/ 133
実例 (3):発電計画問題
- 99. ARC 070 E - NarrowRectangles
99
• 幅 1 の長方形が縦に並んでいる
• 各長方形を左右に動かして繋がっているようにしたい
• 総移動距離の最小値を求めよ