SlideShare a Scribd company logo
1 of 102
Download to read offline
競プロは
人生の役に立つ
NTTデータ数理システム
大槻 兼資
2023/2/5
@JOI 本選講演
1
• 積極的に声やチャットで喋ってもらえたら嬉しいです
最初に
2
• JOI 本選で仲間をたくさん作ろう!
/ 133
• リラックスしよう! 楽しもう!
• JOI 頑張ってください!
• JOI 本選進出おめでとうございます!
• 2014年:東京大学大学院情報理工学系研究科
数理情報学専攻修士課程修了
自己紹介 (本業編)
• 2015年〜:NTT データ数理システム
• 専門は数理工学全般
• アルゴリズム
• 探索, ネットワーク, etc…
• 数理最適化
• シフトスケジューリングなど
• 機械学習
• チャットボットなど
http://www.dis.uniroma1.it/challenge9/download.shtml 3 / 99
自己紹介 (本業編)
• アルゴリズムの楽しさを伝える活動をしています!
• 本を 3 冊出版
• Qiita でアルゴリズムの記事を多数執筆
5
競プロは役に立つ!
• 競プロで世界が広がる!
• 競プロ的な問題は社会にもたくさん!
• 競プロで人生が切り拓かれる!
6
競プロは役に立つ!
• 競プロで世界が広がる!
7
競プロで世界が広がる!
高校
大学
社会
・JOI
・JOI 春合宿
・ICPC
・大学主催コンテストや合宿
・ひたすら精進に打ち込む青春
・AtCoder コンテストは一生楽しめる!
・競プロしなければなかった出会い沢山
・社会人も関わるイベントも沢山
8
JOI 春合宿
https://kininarukotomatome.com/olympiad-informatics/
https://www.ioi-jp.org/joi/2020/index.html
• 対面のコンテストは空気感が違う!
• コンテスト後の感想戦が格別!
• ライバルから刺激を受ける!
9
大学入学後も競プロは続く!
高校
大学
社会
・JOI
・JOI 春合宿
・ICPC
・大学主催コンテストや合宿
・ひたすら精進に打ち込む青春
・AtCoder コンテストは一生楽しめる!
・競プロしなければなかった出会い沢山
・社会人も関わるイベントも沢山
10
ICPC も楽しい!
• 3 人 1 組のチーム戦!!!
https://www.slideshare.net/iwiwi/wakate-web-14323842
• 競プロサークルのある大学もたくさん!
• 合宿やコンテストの開催側にもなれる!
11
競プロで世界が広がる!
高校
大学
社会
・JOI
・JOI 春合宿
・ICPC
・大学主催コンテストや合宿
・ひたすら精進に打ち込む青春
・AtCoder コンテストは一生楽しめる!
・競プロしなければなかった出会い沢山
・社会人も関わるイベントも沢山
12
AtCoder は一生楽しめる!
• AtCoder がずっと続くことを祈りましょう!
• 毎週末、コンテスト後には Twitter が盛り上がる!
https://togetter.com/li/1469550
13
イベント開催もたくさん!
• comb naf
• GigaCode
• 競プロキャンプ
• フォルシアゆるふわコンテスト
• プランクトンサミット
• CPSCO
……などなど、コロナ禍後も少しずつ復活の兆し
14
イベント開催もたくさん!
• comb naf
• GigaCode
• 競プロキャンプ
• フォルシアゆるふわコンテスト
• プランクトンサミット
• CPSCO
……などなど、コロナ禍後も少しずつ復活の兆し
15
イベント開催もたくさん!
• comb naf
• GigaCode
• 競プロキャンプ
• フォルシアゆるふわコンテスト
• プランクトンサミット
• CPSCO
……などなど、コロナ禍後も少しずつ復活の兆し
16
イベント開催もたくさん!
• 一緒にいっぱい楽しもう!!!!!!
17
競プロは役に立つ!
• 競プロで人生が切り拓かれる!
18
競プロで自己実現!
• アルゴリズム研究者になった人!
• AI 研究開発に繋げた人!
• 競プロで築いた人脈で起業した人!
• AtCoder Jobs 経由で就職・転職した人!
• 本を書いた人!
……などなど、競プロで人生が変わるかもしれない!
19
アルゴリズムを学ぶ動機は様々
• 競技プログラミングで勝ちたい!
• コンピュータサイエンスの重要な一分野として
学んでおきたい
• ソフトウェアエンジニアとしてステップアップしたい
• 就職で有利にしたい!
どんな人にもオススメ!!
20
アルゴリズムで身に付く力
• 問題を理解する力 (理解力)
• ロジカルに考える力 (思考力)
• コーディング力 (技術力)
• アルゴリズムを説明する力 (説明力)
• 何かを楽しんで主体的に学んだ経験そのもの
一生モノのスキル
21
競プロは役に立つ!
• 競プロ的な問題は社会にもたくさん!
22
アルゴリズムによる問題解決
数理モデル化
AtCoder
みたいな問題
解
解釈・意思決定
アルゴリズム
23
アルゴリズムは分野横断的
• AI や量子コンピュータなどの、分野の流行に依らない
一生モノのスキル
• むしろ AI を学ぶための強力な下地となる
グラフ
動的計画法
○○法
電気 機械 化学 生物 経済 ○○
• さまざまな分野の問題が、アルゴリズムの目で見ること
によって本質的に同じ問題になったりなる!
/ 133
24
実務で使ったアルゴリズムたち
• DP (動的計画法)
• ナップサック DP
• 区間 DP
• O(3^N) の bit DP
• セグメント木
• 遅延評価つきセグメント木
• セグメント木上の DP
• フロー
• 二部マッチング
• ABC-G でもありそうな最大フロー問題
• ヒューリスティクス系
• 焼きなましやビームサーチ
• 負閉路があるかもしれない最短路問題
25
実務で使ったアルゴリズムたち
• DP (動的計画法)
• ナップサック DP
• 区間 DP
• O(3^N) の bit DP
• セグメント木
• 遅延評価つきセグメント木
• セグメント木上の DP
• フロー
• 二部マッチング
• ABC-G でもありそうな最大フロー問題
• ヒューリスティクス系
• 焼きなましやビームサーチ
• 負閉路つきの最短路問題
DP (動的計画法) とは
26
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
• とても抽象的で汎用的
• 適用範囲が広い
• ただし一見わかりにくい
/ 133
動的計画法の例題
27
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
4m 7m
7 - 4 = 3 秒!
3m
/ 133
動的計画法の例題
28
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
例:
・足場が 7 個
・(2, 9, 4, 5, 1, 6, 10)
/ 133
動的計画法の例題
29
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
例:
・足場が 7 個
・(2, 9, 4, 5, 1, 6, 10)
/ 133
動的計画法の例題
30
足場を「ジャンプ」しながら左端から右端へ行きたい
AtCoder Educational DP Contest A - Frog
ただし「隣の足場」か「1 個飛ばしの足場」にのみ進める
ジャンプの所要時間は「足場の高さの差」
左端から右端までの最短所要時間を求めよ
例:
・足場が 7 個
・(2, 9, 4, 5, 1, 6, 10)
+4
+1 +1
+2
最短: 8 秒
/ 133
グラフの問題と考える
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
32
グラフ
• 物事の関係性を「丸」と「線」を用いて表したもの
• コンピュータサイエンスのあらゆる領域で使われる
頂点 辺
/ 133
• あれもこれも実はグラフ!
• さまざまな分野の問題をグラフに関する問題として
見通よく汎用的に扱える!
33
アルゴリズムの精神
グラフ
/ 133
34
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
• ノード 0 からノード 6 への最短経路を求める!
グラフの問題と考える
/ 133
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
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
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
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
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
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
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
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 テーブル
43
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
メモ
/ 133
頂点 0 への最小コスト (初期条件)
44
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
メモ
/ 133
頂点 1 への最小コスト
45
0
7
2
5 1 4 5 4
4
3
1 9
1 2 3 4 5 6
0
7
7
メモ
/ 133
頂点 2 への最小コスト
46
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 への最小コスト
47
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 への最小コスト
48
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 への最小コスト
49
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 への最小コスト
50
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
メモ
実装上は
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
動的計画法の着眼
52
• メモ化:何度も参照される小さな問題の結果を保存して
すぐに参照できるようにする (キャッシュ)
問題を一連の部分問題に分割し、
各部分問題の解をメモ化しながら順に求めていく手法
• 部分問題への分割:同じ構造を持つ小さな問題 (部分問
題) の結果を使うことで大きな問題が解ける
• ノード 1, 2, 3, 4, 5, 6 への最短経路を順に求めた
/ 133
実務でも登場した問題 2 つ紹介
53
• JOI 本選 2016 A 問題 - オレンジの出荷
• AtCoder ARC 070 E - NarrowRectangles
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
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
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
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
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
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
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
JOI 本選 2016 A 問題
0 1 2 3 4 5 6
3 5 4 9 11 8 10
K = 5
• Frog 問題と同様に「前から何個かのオレンジ」に
ついての小問題に分割していく
• メモ化用の配列を用意する
たとえばこのマスには
前から 7 個のオレンジ
についての答えを格納
/ 133
JOI の問題:オレンジの出荷 (改)
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 の問題:オレンジの出荷 (改)
63
前から 0 個
K = 5
• 前から 0 個のオレンジについての答えは 0
0
/ 133
64
前から 1 個
0
3
K = 5
• 前から 1 個のオレンジについての答えは 5
0 5
+5
1
1 個のオレンジ {3}
を箱詰めするコストは 5
/ 133
65
前から 2 個について考える
0
3
K = 5
0 5
1
5
• 最後の箱をどうするかで場合分けして考える
• 最後の箱が {3, 5} である場合
• 最後の箱が {5} である場合
/ 133
66
前から 2 個について考える
0
3
K = 5
0 5
1
5
+9
• 最後の箱が {3, 5} のとき:コストは 0 + 9 = 9
/ 133
67
前から 2 個について考える
0
3
K = 5
• 最後の箱が {3, 5} のとき:コストは 0 + 9 = 9
0 5
1
5
+5
• 最後の箱が {5} のとき:コストは 5 + 5 = 10
/ 133
68
前から 2 個について考える
0
3
K = 5
• 最後の箱が {3, 5} のとき:コストは 0 + 9 = 9
0 5
1
5
• 最後の箱が {5} のとき:コストは 5 + 5 = 10
9
+9
/ 133
69
前から 3 個について考える
K = 5
0 5 9
0 1 2
3 5 4
• 最後の箱をどうするかで場合分けして考える
• 最後の箱が {3, 5, 4} である場合
• 最後の箱が {5, 4} である場合
• 最後の箱が {4} である場合
/ 133
70
前から 3 個について考える
K = 5
• 最後の箱が {3, 5, 4} のとき:コストは 0 + 11 = 11
0 5 9
0 1 2
3 5 4
+11
/ 133
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
前から 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
前から 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
前から 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
前から 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
前から 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
前から 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
前から 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
前から 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
80
前から 5 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
/ 133
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
82
前から 6 個について考える
K = 5
0 5 9
0 1 2
3 5 4
3
9
11 16
4
11
20
5
8
/ 133
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
84
前から 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
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
86
前から 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
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
前から 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
前から 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
前から 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
前から 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
最適解
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
オレンジの出荷は「区間分割」
0 1 2 3 4 5 6 7 8 9
• 系列データをいくつかの区間に分ける問題に一般化
• 区間分割の仕方を最適化する
• さまざまな分野の問題が、区間分割問題へと帰着される
/ 133
94
http://chasen.naist.jp/chaki/t/2009-09-30/doc/mecab-cabocha-nlp-seminar-2009.pdf
僕は君を愛している
僕 は 君 を 愛し て いる
単語ごとに区切る
/ 133
実例 (1):分かち書き
95
実例 (2):タイムスケジューリング
• 各客になるべく早く荷物を届け終えたい!
• 制約 (1)「何時から何時の間に届けてほしい」
• 制約 (2)「〜分間に 1 回は休憩が必要」 (by 法律)
→ どこで休憩をとるかを最適化したい!
休憩時間ごとに区切る
96
• 発電の on と off のタイミングを最適化する
on off on off
• 需要供給バランスの考慮などもあって、各区間のコス
ト関数 f(i, j) はとても複雑なものになる
• 「〜時間以上連続稼働」といった制約も考慮
/ 133
実例 (3):発電計画問題
97
・さまざまな長さのパネルが順に並んでいる
・それをいくつかのグループに分ける方法を最適化する
/ 133
実例 (4):パネルグループ分け
実務でも登場した問題 2 つ紹介
98
• AtCoder ARC 070 E - NarrowRectangles
ARC 070 E - NarrowRectangles
99
• 幅 1 の長方形が縦に並んでいる
• 各長方形を左右に動かして繋がっているようにしたい
• 総移動距離の最小値を求めよ
実例 (5):発電量調節問題
100
• 毎分ごとに発電量を決めたい
• ただし急激な変化はできない
• 長方形の紙を繋げるという制約に対応する
101
アルゴリズムは分野横断的!
• JOI の問題も、まさにそういう問題たち
グラフ
動的計画法
○○法
電気 機械 化学 生物 経済 ○○
• さまざまな問題が、アルゴリズムの目で見ることに
よって本質的に同じ問題になったりなる!
/ 133
102
全体のまとめ
• JOI 頑張ってください!
• JOI 本選進出おめでとうございます!
• 大学入学後も競プロ人生は続く!
• 仲間をたくさん作ろう!
• 競プロが実務やキャリア形成で役に立つことも

More Related Content

What's hot

プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~Takuya Akiba
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)AtCoder Inc.
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造Takuya Akiba
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムTakuya Akiba
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Inc.
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法Takuya Akiba
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとはTakuya Akiba
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解くshindannin
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題tmaehara
 
ICPC国内予選F解説
ICPC国内予選F解説ICPC国内予選F解説
ICPC国内予選F解説tmaehara
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Inc.
 
部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎Kazuma Mikami
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)AtCoder Inc.
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドMasaki Hara
 

What's hot (20)

双対性
双対性双対性
双対性
 
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
 
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
 
Binary indexed tree
Binary indexed treeBinary indexed tree
Binary indexed tree
 
写像 12 相
写像 12 相写像 12 相
写像 12 相
 
プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造プログラミングコンテストでのデータ構造
プログラミングコンテストでのデータ構造
 
プログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズムプログラミングコンテストでの乱択アルゴリズム
プログラミングコンテストでの乱択アルゴリズム
 
AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説AtCoder Regular Contest 037 解説
AtCoder Regular Contest 037 解説
 
Topological sort
Topological sortTopological sort
Topological sort
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
様々な全域木問題
様々な全域木問題様々な全域木問題
様々な全域木問題
 
ICPC国内予選F解説
ICPC国内予選F解説ICPC国内予選F解説
ICPC国内予選F解説
 
RMQ クエリ処理
RMQ クエリ処理RMQ クエリ処理
RMQ クエリ処理
 
AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説AtCoder Regular Contest 031 解説
AtCoder Regular Contest 031 解説
 
部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎部内勉強会 数え上げの基礎
部内勉強会 数え上げの基礎
 
Union find(素集合データ構造)
Union find(素集合データ構造)Union find(素集合データ構造)
Union find(素集合データ構造)
 
Re永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライドRe永続データ構造が分からない人のためのスライド
Re永続データ構造が分からない人のためのスライド
 
計算量
計算量計算量
計算量
 

Similar to 競プロは人生の役に立つ!

区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)Kensuke Otsuki
 
図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』Proktmr
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Inc.
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかMasami Yabushita
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説AtCoder Inc.
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版Masami Yabushita
 
虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表VerKensuke Otsuki
 

Similar to 競プロは人生の役に立つ! (11)

区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
 
図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』図と実装で理解する『木構造入門』
図と実装で理解する『木構造入門』
 
AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説AtCoder Beginner Contest 006 解説
AtCoder Beginner Contest 006 解説
 
Aizu-2017: B
Aizu-2017: BAizu-2017: B
Aizu-2017: B
 
210122 msi dp
210122 msi dp210122 msi dp
210122 msi dp
 
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうかわんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
わんくま勉強会東京#82 あおいたんのパズルを数学しましょうか
 
RUPC2017:G解説
RUPC2017:G解説RUPC2017:G解説
RUPC2017:G解説
 
CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説CODE FESTIVAL 2014 本選 解説
CODE FESTIVAL 2014 本選 解説
 
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版T82 aoitan あおいたんのパズルを数学しましょうか_修正版
T82 aoitan あおいたんのパズルを数学しましょうか_修正版
 
WUPC2012
WUPC2012WUPC2012
WUPC2012
 
虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver虫食算を作るアルゴリズム 公表Ver
虫食算を作るアルゴリズム 公表Ver
 

More from Kensuke Otsuki

ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)
ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)
ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)Kensuke Otsuki
 
人それぞれの競プロとの向き合い方
人それぞれの競プロとの向き合い方人それぞれの競プロとの向き合い方
人それぞれの競プロとの向き合い方Kensuke Otsuki
 
アルゴリズムを楽しく!@PiyogrammerConference
アルゴリズムを楽しく!@PiyogrammerConferenceアルゴリズムを楽しく!@PiyogrammerConference
アルゴリズムを楽しく!@PiyogrammerConferenceKensuke Otsuki
 
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)Kensuke Otsuki
 
JOI春季ステップアップセミナー 2021 講義スライド
JOI春季ステップアップセミナー 2021 講義スライドJOI春季ステップアップセミナー 2021 講義スライド
JOI春季ステップアップセミナー 2021 講義スライドKensuke Otsuki
 
IT エンジニア本大賞 2021 講演資料
IT エンジニア本大賞 2021 講演資料IT エンジニア本大賞 2021 講演資料
IT エンジニア本大賞 2021 講演資料Kensuke Otsuki
 
Optimization night 4_dp
Optimization night 4_dpOptimization night 4_dp
Optimization night 4_dpKensuke Otsuki
 
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演Kensuke Otsuki
 
虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)
虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)
虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)Kensuke Otsuki
 
ディープラーニング入門 ~ 画像処理・自然言語処理について ~
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ディープラーニング入門 ~ 画像処理・自然言語処理について ~
ディープラーニング入門 ~ 画像処理・自然言語処理について ~Kensuke Otsuki
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方Kensuke Otsuki
 
2部グラフの最小点被覆の求め方
2部グラフの最小点被覆の求め方2部グラフの最小点被覆の求め方
2部グラフの最小点被覆の求め方Kensuke Otsuki
 

More from Kensuke Otsuki (12)

ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)
ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)
ものづくりに活かす数学 (2024 年 1 月 26 日 N/S 高等学校での数学の授業)
 
人それぞれの競プロとの向き合い方
人それぞれの競プロとの向き合い方人それぞれの競プロとの向き合い方
人それぞれの競プロとの向き合い方
 
アルゴリズムを楽しく!@PiyogrammerConference
アルゴリズムを楽しく!@PiyogrammerConferenceアルゴリズムを楽しく!@PiyogrammerConference
アルゴリズムを楽しく!@PiyogrammerConference
 
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
「現実世界に活かす数学」 (麻布高等学校、教養総合、数学講義 5 回目)
 
JOI春季ステップアップセミナー 2021 講義スライド
JOI春季ステップアップセミナー 2021 講義スライドJOI春季ステップアップセミナー 2021 講義スライド
JOI春季ステップアップセミナー 2021 講義スライド
 
IT エンジニア本大賞 2021 講演資料
IT エンジニア本大賞 2021 講演資料IT エンジニア本大賞 2021 講演資料
IT エンジニア本大賞 2021 講演資料
 
Optimization night 4_dp
Optimization night 4_dpOptimization night 4_dp
Optimization night 4_dp
 
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
 
虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)
虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)
虫食算に学ぶ、深さ優先探索アルゴリズム (combmof, 2018/12/23)
 
ディープラーニング入門 ~ 画像処理・自然言語処理について ~
ディープラーニング入門 ~ 画像処理・自然言語処理について ~ディープラーニング入門 ~ 画像処理・自然言語処理について ~
ディープラーニング入門 ~ 画像処理・自然言語処理について ~
 
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
 
2部グラフの最小点被覆の求め方
2部グラフの最小点被覆の求め方2部グラフの最小点被覆の求め方
2部グラフの最小点被覆の求め方
 

Recently uploaded

The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024koheioishi1
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationYukiTerazawa
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptyuitoakatsukijp
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2Tokyo Institute of Technology
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfyukisuga3
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ssusere0a682
 

Recently uploaded (6)

The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024The_Five_Books_Overview_Presentation_2024
The_Five_Books_Overview_Presentation_2024
 
TokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentationTokyoTechGraduateExaminationPresentation
TokyoTechGraduateExaminationPresentation
 
UniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScriptUniProject Workshop Make a Discord Bot with JavaScript
UniProject Workshop Make a Discord Bot with JavaScript
 
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
東京工業大学 環境・社会理工学院 建築学系 大学院入学入試・進学説明会2024_v2
 
TEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdfTEAMIN Service overview for customer_20240422.pdf
TEAMIN Service overview for customer_20240422.pdf
 
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
ゲーム理論 BASIC 演習105 -n人囚人のジレンマモデル- #ゲーム理論 #gametheory #数学
 

競プロは人生の役に立つ!