Se ha denunciado esta presentación.
Se está descargando tu SlideShare. ×

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

Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio
Anuncio

Eche un vistazo a continuación

1 de 102 Anuncio

Más Contenido Relacionado

Más de Kensuke Otsuki (12)

Más reciente (20)

Anuncio

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

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

×