区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)

Kensuke Otsuki
Kensuke OtsukiResearcher at NTT DATA MSI
区間分割の仕方を
最適化する動的計画法
NTT データ数理システム
大槻 兼資
(ペンネーム:けんちょん)
2021/8/19
@JOI 夏季セミナー
1
• 積極的に声やチャットで喋ってもらえたら嬉しいです
最初に
2
• 「ちゃんと理解しなきゃ」と堅くならずに、気楽に!
• アルゴリズム、競プロを楽しもう!
• チューター、ハイレベルコースの詳しい方も、ぜひ
さまざまなコメントを!
/ 133
• 2014年:東京大学大学院情報理工学系研究科
数理情報学専攻修士課程修了
自己紹介 (本業編)
• 2015年~:NTT データ数理システム
• 専門は数理工学全般
• アルゴリズム
• 探索, ネットワーク, etc…
• 数理最適化
• シフトスケジューリングなど
• 機械学習
• チャットボットなど
http://www.dis.uniroma1.it/challenge9/download.shtml 3 / 133
4
自己紹介 (趣味編)
(8月19日) (7 の形) (1234567890 で「コ」)
• 虫食算作り
• 競技プログラミング
/ 133
5
アルゴリズム本を出版
• 2021 年 IT エンジニア本大賞特別賞
• 「問題の解き方」を重視したアルゴリズムの入門書
6
アルゴリズム本を出版
第 1 章
アルゴリズムとは
第 2 章
計算量とオーダー記法
第 3 章
全探索
第 4 章
再帰と分割統治法
第 5 章
動的計画法
第 6 章
二分探索法
第 7 章
貪欲法
第 8 章
配列、連結リスト
ハッシュテーブル
第 9 章
スタックとキュー
第 10 章
グラフと木
第 11 章
Union-Find
第 12 章
ソート
第 13 章
グラフ探索
第 14 章
最短路問題
第 15 章
最小全域木問題
第 16 章
ネットワークフロー
第 17 章
P と NP
第 18 章
難問対策
7
ステップアップセミナー初級
第 1 章
アルゴリズムとは
第 2 章
計算量とオーダー記法
第 3 章
全探索
第 4 章
再帰と分割統治法
第 5 章
動的計画法
第 6 章
二分探索法
第 7 章
貪欲法
第 8 章
配列、連結リスト
ハッシュテーブル
第 9 章
スタックとキュー
第 10 章
グラフと木
第 11 章
Union-Find
第 12 章
ソート
第 13 章
グラフ探索
第 14 章
最短路問題
第 15 章
最小全域木問題
第 16 章
ネットワークフロー
第 17 章
P と NP
第 18 章
難問対策
8
ステップアップセミナー中級
第 1 章
アルゴリズムとは
第 2 章
計算量とオーダー記法
第 3 章
全探索
第 4 章
再帰と分割統治法
第 5 章
動的計画法
第 6 章
二分探索法
第 7 章
貪欲法
第 8 章
配列、連結リスト
ハッシュテーブル
第 9 章
スタックとキュー
第 10 章
グラフと木
第 11 章
Union-Find
第 12 章
ソート
第 13 章
グラフ探索
第 14 章
最短路問題
第 15 章
最小全域木問題
第 16 章
ネットワークフロー
第 17 章
P と NP
第 18 章
難問対策
9
今回の話
第 1 章
アルゴリズムとは
第 2 章
計算量とオーダー記法
第 3 章
全探索
第 4 章
再帰と分割統治法
第 5 章
動的計画法
第 6 章
二分探索法
第 7 章
貪欲法
第 8 章
配列、連結リスト
ハッシュテーブル
第 9 章
スタックとキュー
第 10 章
グラフと木
第 11 章
Union-Find
第 12 章
ソート
第 13 章
グラフ探索
第 14 章
最短路問題
第 15 章
最小全域木問題
第 16 章
ネットワークフロー
第 17 章
P と NP
第 18 章
難問対策
10
今日の話 (本 5.6 節)
• 系列データをいくつかの区間に分ける
• 区間分割の仕方を最適化したい
0 1 2 3 4 5 6 7 8 9
/ 133
11
今日の話 (本 5.6 節)
• 系列データをいくつかの区間に分ける
• 区間分割の仕方を最適化したい
0 1 2 3 4 5 6 7 8 9
/ 133
12
今日の話 (本 5.6 節)
0 1 2 3 4 5 6 7 8 9
• 系列データをいくつかの区間に分ける
• JOI での出題が極めて多いパターン!!!
• 区間分割の仕方を最適化したい
• 現実世界への応用も多い!!!
/ 133
13
今日の話
イントロ
動的計画法
区間分割
/ 133
14
今日の話
イントロ
/ 133
アルゴリズムとは
• ある問題を解くための方法、手順のこと
• それを実装したものがプログラム
• 「入力」を入れると「出力」を返す装置
15
アルゴリズム
入力 出力
/ 133
16
アルゴリズムの例
• a × b が偶数か奇数かを判定する (練習コンテスト 2)
https://atcoder.jp/contests/abc086/tasks/abc086_a
/ 133
17
アルゴリズムの例
https://atcoder.jp/contests/abc086/tasks/abc086_a
判定
整数 a a × b が
偶数か奇数か
整数 b
• a × b が偶数か奇数かを判定する (練習コンテスト 2)
/ 133
18
アルゴリズムの例
カーナビ
地図
現在地
目的地
目的地へ
至る経路
単語検索
文書 文書に単語
が含まれるか
単語
数独
ソルバー
/ 133
19
本格的な例:幅優先探索
• 迷路の最短路を求めよう!
• スタート (S) からゴール (G) への最短経路は?
/ 133
20
• まず S から 1 手で行けるマスに「1」と書く
本格的な例:幅優先探索
/ 133
21
• 次に「1」から 1 手で行けるマスに「2」と書く
本格的な例:幅優先探索
/ 133
22
• 「2」から 1 手で行けるマスに「3」と書く
本格的な例:幅優先探索
/ 133
23
• 「3」から 1 手で行けるマスに「4」と書く
本格的な例:幅優先探索
/ 133
24
• 「4」から 1 手で行けるマスに「5」と書く
本格的な例:幅優先探索
/ 133
25
• 「5」から 1 手で行けるマスに「6」と書く
本格的な例:幅優先探索
/ 133
26
• 「6」から 1 手で行けるマスに「7」と書く
本格的な例:幅優先探索
/ 133
27
• 「7」から 1 手で行けるマスに「8」と書く
本格的な例:幅優先探索
/ 133
28
• 「8」から 1 手で行けるマスに「9」と書く
本格的な例:幅優先探索
/ 133
29
• 「9」から 1 手で行けるマスに「10」と書く
本格的な例:幅優先探索
/ 133
30
• 「10」から 1 手で行けるマスに「11」と書く
本格的な例:幅優先探索
/ 133
31
• 「11」から 1 手で行けるマスに「12」と書く
本格的な例:幅優先探索
/ 133
32
• 「12」から 1 手で行けるマスに「13」と書く
本格的な例:幅優先探索
/ 133
33
• 「13」から 1 手で行けるマスに「14」と書く
本格的な例:幅優先探索
/ 133
34
• 「14」から 1 手で行けるマスに「15」と書く
本格的な例:幅優先探索
/ 133
35
• 「15」から 1 手で行けるマスに「16」と書く
• これでゴール!!!
本格的な例:幅優先探索
/ 133
36
• ゴールから、「数値が 1 ずつ下がっていくように」
遡っていくと、最短経路が得られる
本格的な例:幅優先探索
/ 133
37
幅優先探索の実応用
• カーナビ
• 電車の乗り換え案内
• パズル (15-パズルなど) の最小手数
38
8-パズル
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4 1
5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1 5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8
6
1
8
3
2
4
5
7 6
1
8
3
7
4
5
2
6
3
8
5
4
1
2
7 6
3
7
5
4
1
6
2
8
初期配置
/ 133
39
8-パズル
2
7
3
4
1
5
8 6
初期配置
/ 133
40
8-パズル
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
初期配置
/ 133
41
8-パズル
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4 1
5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1 5
8 6
初期配置
/ 133
42
8-パズル
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4 1
5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1 5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8
6
1
8
3
2
4
5
7 6
1
8
3
7
4
5
2
6
3
8
5
4
1
2
7 6
3
7
5
4
1
6
2
8
初期配置
/ 133
43
8-パズル
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4 1
5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8 6
2
7
3
4
1 5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8 6
2
7
3
4
1
5
8
6
2
7
3
4
1
5
8
6
1
8
3
2
4
5
7 6
1
8
3
7
4
5
2
6
3
8
5
4
1
2
7 6
3
7
5
4
1
6
2
8
初期配置
目標配置 / 133
44
アルゴリズムを学ぶ動機は様々
• 競技プログラミングで勝ちたい!
• コンピュータサイエンスの重要な一分野として
学んでおきたい
• ソフトウェアエンジニアとしてステップアップしたい
• 就職で有利にしたい!
どんな人にもオススメ!!
/ 133
45
アルゴリズムによる問題解決
数理モデル化
JOI
みたいな問題
解
解釈・意思決定
アルゴリズム
/ 133
46
アルゴリズムは分野横断的
• AI や量子コンピュータなどの、分野の流行に依らない
一生モノのスキル
• むしろ AI を学ぶための強力な下地となる
グラフ
動的計画法
○○法
電気 機械 化学 生物 経済 ○○
• さまざまな分野の問題が、アルゴリズムの目で見ること
によって本質的に同じ問題になったりなる!
/ 133
47
アルゴリズムは分野横断的
0 1 2 3 4 5 6 7 8 9
• たとえば、今回の「区間分割」の問題も
• さまざまな領域の問題がこの問題に帰着できる!
/ 133
48
今日の話
動的計画法
/ 133
動的計画法とは
49
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
• とても抽象的で汎用的
• 適用範囲が広い
• ただし一見わかりにくい
/ 133
動的計画法の例題
50
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
4m 7m
7 - 4 = 3 秒!
3m
/ 133
動的計画法の例題
51
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
例:
・足場が 7 個
・(2, 9, 4, 5, 1, 6, 10)
/ 133
動的計画法の例題
52
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
例:
・足場が 7 個
・(2, 9, 4, 5, 1, 6, 10)
/ 133
動的計画法の例題
53
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
例:
・足場が 7 個
・(2, 9, 4, 5, 1, 6, 10)
+4
+1 +1
+2
最短: 8 秒
/ 133
グラフの問題と考える
54
例:
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
55
グラフ
• 物事の関係性を「丸」と「線」を用いて表したもの
• コンピュータサイエンスのあらゆる領域で使われる
頂点 辺
/ 133
56
• 辺に「向き」があることもある (有向グラフ)
グラフ
/ 133
• あれもこれも実はグラフ!
• さまざまな分野の問題をグラフに関する問題として
見通よく汎用的に扱える!
57
アルゴリズムの精神
グラフ
/ 133
58
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 0 からノード 6 への最短経路を求める!
グラフの問題と考える
/ 133
59
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
問題を次のように分解する
60
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
問題を次のように分解する
61
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
問題を次のように分解する
62
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
問題を次のように分解する
63
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
問題を次のように分解する
64
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
問題を次のように分解する
65
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
問題を次のように分解する
66
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
問題を次のように分解する
67
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
メモ化用の DP テーブル
68
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
メモ
/ 133
頂点 0 への最小コスト (初期条件)
69
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
メモ
/ 133
頂点 1 への最小コスト
70
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
7
7
メモ
/ 133
頂点 2 への最小コスト
71
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
2
5
2
12 vs. 2
メモ
/ 133
頂点 3 への最小コスト
72
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
4
1
2
3 vs. 11
3
メモ
/ 133
頂点 4 への最小コスト
73
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
メモ
0 7
3
4
2
7 vs. 5
3 5
/ 133
頂点 5 への最小コスト
74
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
1
5
2
10 vs. 4
3 5 4
メモ
/ 133
頂点 6 への最小コスト
75
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0 7
9
4
2
8 vs. 14
3 5 4 8
メモ
実装上は
76
• メモ化用の 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
動的計画法の着眼
77
• メモ化:何度も参照される小さな問題の結果を保存して
すぐに参照できるようにする (キャッシュ)
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
• 部分問題への分割:同じ構造を持つ小さな問題 (部分問
題) の結果を使うことで大きな問題が解ける
• ノード 1, 2, 3, 4, 5, 6 への最短経路を順に求めた
/ 133
動的計画法は汎用的
• 動的計画法で解決できる問題は数多くある
• ナップサック問題
• スケジューリング問題
• 発電計画問題
• 編集距離
• 音声認識パターンマッチング問題
• 文章の分かち書き
• 隠れマルコフモデル
78
• 習うより慣れよう!
/ 133
拙著の動的計画法の章
• 5 章 - 設計技法 (3):動的計画法
79
• 5.1 動的計画法とは
• 5.2 動的計画法の例題
• 5.3 動的計画法に関連する諸概念
• 5.4 動的計画法の例 (1):ナップサック問題
• 5.5 動的計画法の例 (2):編集距離
• 5.6 動的計画法の例 (3):区間分割の仕方を最適化
• 5.7 まとめ
/ 133
80
今日の話
区間分割
/ 133
81
区間分割
0 1 2 3 4 5 6 7 8 9
• 系列データをいくつかの区間に分ける
• 区間分割の仕方を最適化したい
• さまざまな分野の問題が、区間分割問題へと帰着される
/ 133
応用例(1): 分かち書き
82
http://chasen.naist.jp/chaki/t/2009-09-30/doc/mecab-cabocha-nlp-seminar-2009.pdf
僕は君を愛している
僕 は 君 を 愛し て いる
単語ごとに区切る
/ 133
応用例(2): 発電計画問題
83
• 発電の on と off のタイミングを最適化する
on off on off
• 需要供給バランスの考慮などもあって、各区間のコス
ト関数 f(i, j) はとても複雑なものになる
• 「~時間以上連続稼働」といった制約も考慮
/ 133
応用例(3): パネルグループ分け
84
さまざまな長さのパネルが順に並んでいる
それをいくつかのグループに分ける
各グループのパネルたちを良い条件に揃えたい
/ 133
応用例(4): タイムスケジューリング
85
• お客さまを順に回る配送 (配送順序は固定)
• 「何時から何時の間に届けてほしい」
• 「~分間に 1 回は休憩が必要」という制約もある
→ どこで休憩をとるかを最適化
休憩場所ごとに区切る
/ 133
86
問題例(1):オレンジの出荷 (改)
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 7 8
K = 5
/ 133
87
問題例(1):オレンジの出荷 (改)
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
88
問題例(1):オレンジの出荷 (改)
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
89
問題例(1):オレンジの出荷 (改)
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
90
問題例(1):オレンジの出荷 (改)
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
91
問題例(1):オレンジの出荷
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
92
問題例(1):オレンジの出荷
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
93
問題例(1):オレンジの出荷
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
94
問題例(1):オレンジの出荷
JOI 本選 2016 A 問題
0 1 2 3 4 5 6
3 5 4 9 11 8 10
K = 5
• Frog 問題と同様に「前から何個かのオレンジ」に
ついての小問題に分割していく
• メモ化用の配列を用意する
たとえばこのマスには
前から 7 個のオレンジ
についての答えを格納
/ 133
95
問題例(1):オレンジの出荷
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
96
前から 0 個
K = 5
• 前から 0 個のオレンジについての答えは 0
0
/ 133
97
前から 1 個
0
3
K = 5
• 前から 1 個のオレンジについての答えは 5
0 5
+5
1
1 個のオレンジ {3}
を箱詰めするコストは 5
/ 133
98
前から 2 個について考える
0
3
K = 5
0 5
1
5
• 最後の箱をどうするかで場合分けして考える
• 最後の箱が {3, 5} である場合
• 最後の箱が {5} である場合
/ 133
99
前から 2 個について考える
0
3
K = 5
0 5
1
5
+9
• 最後の箱が {3, 5} のとき:コストは 0 + 9 = 9
/ 133
100
前から 2 個について考える
0
3
K = 5
• 最後の箱が {3, 5} のとき:コストは 0 + 9 = 9
0 5
1
5
+5
• 最後の箱が {5} のとき:コストは 5 + 5 = 10
/ 133
101
前から 2 個について考える
0
3
K = 5
• 最後の箱が {3, 5} のとき:コストは 0 + 9 = 9
0 5
1
5
• 最後の箱が {5} のとき:コストは 5 + 5 = 10
9
+9
/ 133
102
前から 3 個について考える
K = 5
0 5 9
0 1 2
3 5 4
• 最後の箱をどうするかで場合分けして考える
• 最後の箱が {3, 5, 4} である場合
• 最後の箱が {5, 4} である場合
• 最後の箱が {4} である場合
/ 133
103
前から 3 個について考える
K = 5
• 最後の箱が {3, 5, 4} のとき:コストは 0 + 11 = 11
0 5 9
0 1 2
3 5 4
+11
/ 133
104
前から 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
105
前から 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
106
前から 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
107
前から 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
108
前から 4 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11
+29
• 最後の箱が {3, 5, 4, 9} のとき:コストは 0 + 29 = 29
/ 133
109
前から 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
110
前から 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
111
前から 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
112
前から 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
113
前から 5 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
/ 133
114
前から 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
115
前から 6 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20
5
8
/ 133
116
前から 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
117
前から 7 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20 25
5 6
8 10
/ 133
118
前から 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
119
前から 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
/ 133
120
前から 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
121
前から 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
122
前から 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
123
前から 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
124
前から 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
125
最適解
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
126
問題例(2):白昼夢
ABC 049 C - 白昼夢
文字列が与えられる
e r a s e d r e a m e r a s e
これを “erase”, “dream”, “eraser”, “dreamer”
に分割することが可能かどうかを判定せよ
e r a s e d r e a m e r a s e
/ 133
127
問題例(3):重み付き区間スケジューリング
有名問題
いくつかの区間が与えられる
どの 2 つも重ならないように区間を選ぶ
選んだ区間のスコアの総和を最大にせよ
3点
1点
4点
5点
2点
6点
3点
/ 133
128
問題例(3):重み付き区間スケジューリング
有名問題
いくつかの区間が与えられる
選んだ区間のスコアの総和を最大にせよ
3点
1点
5点
2点
6点
3点
4点
どの 2 つも重ならないように区間を選ぶ
/ 133
問題例(4): 分かち書き (再掲)
129
http://chasen.naist.jp/chaki/t/2009-09-30/doc/mecab-cabocha-nlp-seminar-2009.pdf
僕は君を愛している
僕 は 君 を 愛し て いる
単語ごとに区切る
/ 133
問題例(5): 発電計画問題 (再掲)
130
• 発電の on と off のタイミングを最適化する
on off on off
• 需要供給バランスの考慮などもあって、各区間のコス
ト関数 f(i, j) はとても複雑なものになる
• 「~時間以上連続稼働」といった制約も考慮
/ 133
問題例(6): パネルグループ分け (再掲)
131
さまざまな長さのパネルが順に並んでいる
それをいくつかのグループに分ける
各グループのパネルたちを良い条件に揃えたい
/ 133
132
アルゴリズムは分野横断的!
• 競プロのパズル的問題は、まさにそういう問題たち
グラフ
動的計画法
○○法
電気 機械 化学 生物 経済 ○○
• さまざまな問題が、アルゴリズムの目で見ることに
よって本質的に同じ問題になったりなる!
/ 133
133
全体のまとめ
• アルゴリズムは何をするにも重要な基礎、
どんな人にもオススメ!
• さまざまな問題が、汎用的に見通しよく扱えるよう
になる (今回は区間分割を例にとった)
• アルゴリズムは楽しい!!
134
付録
その他の動的計画法
拙著の動的計画法の章
• 5 章 - 設計技法 (3):動的計画法
135
• 5.1 動的計画法とは
• 5.2 動的計画法の例題
• 5.3 動的計画法に関連する諸概念
• 5.4 動的計画法の例 (1):ナップサック問題
• 5.5 動的計画法の例 (2):編集距離
• 5.6 動的計画法の例 (3):区間分割の仕方を最適化
• 5.7 まとめ
3 つの代表的な遷移パターン
136
• ナップサック問題
• 編集距離
• 区間分割 (済)
3 つの代表的な遷移パターン
137
• ナップサック問題
ナップサック問題
138
N 個の品物があって、いくつか選びたい
各品物には「重さ」と「価値」の属性がある
選んだ品物の重さの合計が W を超えないようにしつつ
価値の総和を最大化せよ
https://www.msi.co.jp/nuopt/introduction/index.html
ナップサック問題
139
N 個の品物があって、いくつか選びたい
各品物には「重さ」と「価値」の属性がある
選んだ品物の重さの合計が W を超えないようにしつつ
価値の総和を最大化せよ
dp[i][w] ← N 個の品物のうち、最初の i 個のみ考える
その中から重さの合計が w を超えないようにしつつ
選んだときの価値の総和の最大値
最初の i 個についての問題 (部分問題)
ナップサック問題
140
dp[i+1][w] = max(dp[i][w],
dp[i][w-wei[i]] + val[i])
新たな品物を選ばない場合
新たな品物を選ぶ場合
重さ 価値
dp[i][w] ← N 個の品物のうち、最初の i 個のみ考える
その中から重さの合計が w を超えないようにしつつ
選んだときの価値の総和の最大値
• dp[i][0], dp[i][1], … を用いて、       
dp[i+1][0], dp[i+1][1], … を表す
ナップサック DP の遷移
141
ナップサックに入れた重さ
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) の場合
ナップサック DP の遷移のポイント
142
• 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
例(1): サイゼリヤ問題
143
• 予算 1000 円で、最高何 kcal とれるか?
https://qiita.com/marusho_summers/items/a2d3681fac863734ec8a
• ナップサック問題そのもの
• ナップサックの容量が予算に対応:1000 円
• 品物の価値が、カロリーに対応
・ポテトのグリル
(199 円, 366 kcal)
・アーリオ•オーリオ
(574 円, 1120 kcal)
・ラージライス
(219 円, 454 kcal)
合計:992 円, 1940 kcal
例(2): 隠れマルコフモデル
144
• 系列データを「潜在変数」のマルコフ連鎖で表すもの
追加の添字 i+1 番目の状態が i 番目のみに依る
• 前回の状態によって、次回の各状態の起こりやすさが
変化する
https://mathwords.net/hiddenmarkov
風邪 or 元気
からなる系列データ
例(2): 隠れマルコフモデル
145
• 系列データを「潜在変数」のマルコフ連鎖で表すもの
追加の添字 i+1 番目の状態が i 番目のみに依る
• 潜在変数の最も確からしい経路を求める Viterbi のアル
ゴリズムは、ナップサック DP とほとんど同じもの
• 音声認識
• 品詞分析
• 株価の変動予測
さまざまな応用
3 つの代表的な遷移パターン
146
• 編集距離
編集距離
147
2 つの文字列 S, T がある
S に以下の 3 通りの操作を繰り返すことで T に変換したい
・変更: S の文字を 1 つ選んで変更
・削除: S の文字を 1 つ選んで削除
・挿入: S の好きな箇所に好きな文字を 1 文字挿入
最小回数を求めよ
例:
S = logistic
T = algorithm
→ 6 回
二系列の DP
148
例:
S = logistic
T = algorithm
→ 6 回
dp[i][j] ← S の最初の i 文字と、T の最初の j 文字との
間についての操作回数の最小値
編集距離を求める DP の遷移
149
dp[i][j] ← S の最初の i 文字と、T の最初の j 文字との
間についての操作回数の最小値
応用が広く、分野横断的!
150
• diff コマンド
• 音声認識、画像認識、空間認識
• DP マッチング
• 二系列データの類似度を考える問題全般に適用
• スペルチェッカー
• バイオインフォマティクス
• 系列アラインメント (2 つの DNA の類似度を測るなど)
• 手書き文字認識
1 of 150

More Related Content

What's hot(20)

Marp TutorialMarp Tutorial
Marp Tutorial
Rui Watanabe3.2K views
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
Preferred Networks55.4K views
4 データ間の距離と類似度4 データ間の距離と類似度
4 データ間の距離と類似度
Seiichi Uchida3.6K views
最適化超入門最適化超入門
最適化超入門
Takami Sato174.6K views
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
Yahoo!デベロッパーネットワーク25.7K views
指数時間アルゴリズム入門指数時間アルゴリズム入門
指数時間アルゴリズム入門
Yoichi Iwata44.7K views
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイする
Takayuki Itoh122.3K views
AtCoder Beginner Contest 023 解説AtCoder Beginner Contest 023 解説
AtCoder Beginner Contest 023 解説
AtCoder Inc.17.3K views
Binary indexed treeBinary indexed tree
Binary indexed tree
HCPC: 北海道大学競技プログラミングサークル14.3K views
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
京大 マイコンクラブ242.2K views
初めてのグラフカット初めてのグラフカット
初めてのグラフカット
Tsubasa Hirakawa8.7K views

Similar to 区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)(20)

区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)