Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
AtCoder Beginner Contest 005
解説
AtCoder株式会社 代表取締役
高橋 直大
2014/3/22 1
競技プログラミングを始める前に
• 競技プログラミングをやったことがない人へ
– まずはこっちのスライドを見よう!
– http://www.slideshare.net/chokudai/abc004
2014/3/22 2
©AtCoder Inc. All rights reserved. 3
A問題 おいしいたこ焼きの作り方
1. 問題概要
2. アルゴリズム
2014/3/22 3
A問題 問題概要
• Yグラムの小麦粉がある。
• Xグラムの小麦粉につき、1個たこ焼きを作ることが
可能である
• 最大いくつのたこ焼きを作ることが出来るか?
2014/3/22 4
A問題 アルゴリズム
• 基本的なプログラムの流れ
– 標準入力から、必要な入力を受け取る
• 今回の場合は、x, yの2つの整数
– 問題で与えられた処理を行う
• 今回は、yグラムの小麦粉でたこ焼きが何個作れるか算出する
– 標準出力へ、答...
A問題 アルゴリズム
• 入力
– 2つの数字を、標準入力から受け取る
• Cであれば、scanf(“%d %d”, &x, &y); など
• C++であれば、cin >> x >> y;
• 入力の受け取り方は、下記の練習問題に記載がありま...
A問題 アルゴリズム
• Yグラムの小麦粉から、Xグラムで作れるたこ焼きを、
いくつ作れるか考える。
– これは、単純な算数の問題
• Y ÷ Xで求めることが出来る。
– 整数同士の演算なので、殆どの言語で勝手に小数点以
下は切り捨てられる。...
A問題 アルゴリズム
• 具体的な記述
– int ret = Y / X; のような感じ
– 答えを格納する変数に、計算結果を入れておく
2014/3/22 8
A問題 アルゴリズム
• 出力
– 求めた答えを、標準出力より出力する。
– 言語によって違います。
• printf(%d¥n, ret); (C)
• cout << ret << endl; (C++)
• System.out.prin...
©AtCoder Inc. All rights reserved. 10
B問題 おいしいたこ焼きの食べ方
1. 問題概要
2. アルゴリズム
2014/3/22 10
B問題 問題概要
• たこ焼きがN個作られている
• それぞれのたこ焼きが、何秒前に作られているかが
与えられる
• 一番できたてのたこ焼きが、何秒前に出来ているか
を出力しなさい
2014/3/22 11
B問題 アルゴリズム
• 入力
– まずたこ焼きの数を表す整数Nを受け取る
– 次に、長さNの配列を確保する
• リストなどの動的な配列でも問題ない
– N回のループを回す
• それぞれのたこ焼きが、何秒後に出来ているかを配列に格納す
る
20...
B問題 アルゴリズム
• 処理
– 解法1:最小値を順番に探す
• int ret = 9999999;など、大き目の値を答えに入れておく。
– Int ret = T[0]; など、最初の値を入れてもOK。
• ループを回し、1個ずつ、ret...
B問題 アルゴリズム
• 出力
– A問題と同じく、答えを出力するだけ
2014/3/22 14
B問題 アルゴリズム
• おまけ
– 入力を配列に格納しなくても解ける
• 解法1であれば、配列に格納していなくても、順番に数字を読んで
いけば良い。
2014/3/22 15
©AtCoder Inc. All rights reserved. 16
C問題 おいしいたこ焼きの売り方
1. 問題概要
2. アルゴリズム
2014/3/22 16
C問題 問題概要
• たこ焼きは、出来てからT秒以内に売らなければな
らない。
• たこ焼きをN個作る
– 各たこ焼きはA_i秒後に作成される
• お客さんはM人くる
– 各お客さんはB_j秒後に訪れる
• 全てのお客さんに対し、作られてからT...
C問題 問題概要
• Sample5 T = 2
– 以下のように、客に対してたこ焼きを割り当てる
2014/3/22 18
1
3
6
10
15
4
8
16
C問題 問題概要
• T = 1になった場合
– 割り当てることが出来なかったら失敗
2014/3/22 19
1
3
6
10
15
4
8
16
C問題 アルゴリズム
• 各お客さんに対し、どのたこ焼きを売るかを決める
– M人のお客さんに、N個のたこ焼きを1つずつ割り当て
る?
– 組み合わせの数は、N! / (N-M)!通り。
• N,Mともに上限は100
• N=M=100の時、1...
C問題 アルゴリズム
• 実行時間を早くするためには?
– 現在、明らかに無駄な組み合わせを大量に考えてしまっ
ている
– 無駄な組み合わせを取り除こう!
2014/3/22 21
C問題 アルゴリズム
• 明らかに無駄なパターン1
– A < Bの時、A番目のお客さんのたこ焼きより、B番目のお
客さんのたこ焼きの方が新しいケースは、考えなくて良い
• 後からきたお客さんに、先に来たお客さんよりも古いたこ焼きを
売る理由は...
C問題 アルゴリズム
• 明らかに無駄なパターン2
– T秒以内に作られたたこ焼きの中で、最も古いたこ焼き以
外は考えなくても良い
• そうした方が、後のお客さんの選択肢が増える
• こうすると、実は売り方は1通りしかなくなってしまう
– 売れ...
C問題 アルゴリズム
• 実装の流れ
– M人に対して、たこ焼きが売れるかどうかループを回して
判定を行う
• N個のたこ焼きに対してループを回し、まだ売られていないもので、
T秒以内に作られたものがあるかどうかを探す
– あれば、最も昔に作ら...
C問題 アルゴリズム
• おまけ1
– 実装を工夫すると、1 <= N, M <= 100,000でも間に合う
– 工夫する点
• 前の人が食べたたこ焼きより、次の人が食べるたこ焼きは絶対に
後のものである
• つまり、前の人が食べたたこ焼きの...
C問題 アルゴリズム
• 計算のイメージ
– こんな感じで、調べる範囲が被らない
2014/3/22 26
1 3 6 10 15
4
8
16
C問題 アルゴリズム
• おまけ2
– 二部グラフの最大マッチングでも解くことが可能
• ただし、大きなサイズになると解けない
– 興味のある人は、以下のワードで検索
• 二部グラフ
• 二部グラフの最大マッチング
2014/3/22 27
C問題 問題概要
• こんな感じのグラフを作って、フローをM流す
– T = 5 のときのグラフ
– 流せればyes、流せなければno
2014/3/22 28
1
3
6
10
15
4
8
16
S T
©AtCoder Inc. All rights reserved. 29
D問題 おいしいたこ焼きの焼き方
1. 問題概要
2. アルゴリズム
2014/3/22 29
D問題 問題概要
• N*Nの正方形のたこ焼き器が存在する
• 各マスでは1個のたこ焼きを作ることが可能で、その
マスで作れるたこ焼きのおいしさは整数D_ijである
• 店員がQ人存在し、各店員はP_k個のたこ焼きを一
度に焼くことが可能である...
D問題 問題概要
• 各店員に対し、使うべき長方形が変わってくる
2014/3/22 31
2 2 1
2 2 1
1 1 1
9個 4個 1個
D問題 問題概要
• 各店員に対し、使うべき長方形が変わってくる
– 美味しさの合計が最大になるときの合計値を出力
2014/3/22 32
2 2 1
2 2 1
1 1 1
9個 4個 1個
13 8 2
D問題 アルゴリズム
• 普通に判定すると・・・?
• 長方形の作り方は、縦の選び方がN * (N-1)通り、横
の選び方が N* (N-1)通りあるので、大凡N^4通り存
在する
• これらに対して、おいしさの合計の計算をすると、調
べる必要...
D問題 アルゴリズム
• 長方形の中の数字の和を、高速に求めなくてはなら
ない
– 求め方はたくさんある!
• 高速な求め方を考えよう!
2014/3/22 34
D問題 アルゴリズム
• 解法1: 全ての長方形を一瞬で計算できるようにす
る
– 赤い部分を求めたい
2014/3/22 35
D問題 アルゴリズム
• 解法1: 全ての長方形を一瞬で計算できるようにす
る
– 赤い部分を求めたい
• まずはこの右下の部分までの青い部分を求め
2014/3/22 36
D問題 アルゴリズム
• 解法1: 全ての長方形を一瞬で計算できるようにす
る
– 赤い部分を求めたい
• まずはこの右下の部分までの青い部分を求め、緑の部分と
2014/3/22 37
D問題 アルゴリズム
• 解法1: 全ての長方形を一瞬で計算できるようにす
る
– 赤い部分を求めたい
• まずはこの右下の部分までの青い部分を求め、緑の部分と紫の
部分を引き、
2014/3/22 38
D問題 アルゴリズム
• 解法1: 全ての長方形を一瞬で計算できるようにす
る
– 赤い部分を求めたい
• まずはこの右下の部分までの青い部分を求め、緑の部分と紫の
部分を引き、オレンジの部分を足せば、赤い部分が求まる
2014/3/22 39
D問題 アルゴリズム
• つまり、右下までの面積さえ予め求められれば、全
ての長方形の面積は、一瞬で求められる
– じゃあ、どうやって予め計算するの?
– パターンはN^2通りしかないので、O(N^4)で愚直に計算で
きる
• 上手くやるとO(...
D問題 アルゴリズム
• O(n^2)で上手くやる方法
– 赤い部分を求めたい
2014/3/22 41
D問題 アルゴリズム
• O(n^2)で上手くやる方法
– 赤い部分を求めたい
• 青い部分と
2014/3/22 42
D問題 アルゴリズム
• O(n^2)で上手くやる方法
– 赤い部分を求めたい
• 青い部分と緑の部分を足して、
2014/3/22 43
D問題 アルゴリズム
• O(n^2)で上手くやる方法
– 赤い部分を求めたい
• 青い部分と緑の部分を足して、紫の部分を引いた後、
2014/3/22 44
D問題 アルゴリズム
• O(n^2)で上手くやる方法
– 赤い部分を求めたい
• 青い部分と緑の部分を足して、紫の部分を引いた後、オレンジの
1マス部分だけ足してあげれば良い
– よって、右下から順番に動的計画法で埋めていけば良い
2014/...
D問題 アルゴリズム
• 解き方1 解き方と計算量まとめ
– 右下まで必ず使う長方形を全通り列挙する O(n^2)
• その長方形の美味しさの合計を列挙する O(1)
– 各長方形を全通り列挙する O(n^4)
• その長方形の美味しさの合計を...
D問題 アルゴリズム
• 店員について
– 1回の判定で、1からN*Nまでの全パターンについて考え
てしまえば、全ての店員について、計算し終わった後に出
力すれば良い。
– よって、一人一人の店員に対して、全ての長方形を考え
てあげる必要はない...
D問題 アルゴリズム
• 以下のようなケースの場合、3個のたこ焼きを焼い
た方が、4個のたこ焼きを焼くより良いパターンが存
在する
2014/3/22 48
1 1 1
1 1 1
9 9 9
1 2 3
9 18 27
4 5 6
20 0 ...
D問題 アルゴリズム
• 以下のようなケースの場合、3個のたこ焼きを焼い
た方が、4個のたこ焼きを焼くより良いパターンが存
在する
– 小さい方から順番に、これまでの最大値を塗りつぶしてい
けば良い
2014/3/22 49
1 1 1
1 1...
D問題 アルゴリズム
• 解法2:計算順序を変えるだけで多少早くなる
– 例えば、赤い部分を求めた後、青い部分を求めたい時
2014/3/22 50
D問題 アルゴリズム
• 解法2:計算順序を変えるだけで多少早くなる
– 例えば、赤い部分を求めた後、青い部分を求めたい時、
予め計算した赤い部分に、新しく増えた緑の部分を足せ
ば良い
2014/3/22 51
D問題 アルゴリズム
• 計算量の変化は?
– 全部の長方形がO(N^4)
• 和は、一回り小さい長方形から、1行足すだけで求められる。
• 1行足すコストは、最大Nマスなので、O(N)
– これをさらに早くすることが出来る!
2014/3/2...
D問題 アルゴリズム
• この緑の部分を一瞬で求められるように、事前計算
をしておきたい。
– 1行の全列挙はパターン数もO(n^3)と少ないので、簡単に
計算可能
• 愚直でO(n^5) 解法2と同じ計算方法でO(n^4)
2014/3/22...
D問題 アルゴリズム
• おまけ 事前計算の高速な計算方法
– 先ほどと同じで、紫の部分からオレンジの部分を引くだけ
• これは普通に後ろからループするだけで事前計算出来る。
– これがO(n^2)
2014/3/22 54
D問題 まとめ
• 高速に計算するためには、計算するパーツの事前
計算が大切!
2014/3/22 55
D問題 おまけ
• O(n^4)のアルゴリズムを紹介したが、O(n^5)でも間
に合う
– 回答例2の、横のメモを使わないパターン
– 愚直な計算で、横のメモだけ使うパターン
2014/3/22 56
Upcoming SlideShare
Loading in …5
×

AtCoder Beginner Contest 005 解説

4,645 views

Published on

AtCoder Beginner Contest 005 解説

Published in: Education
  • Be the first to comment

AtCoder Beginner Contest 005 解説

  1. 1. AtCoder Beginner Contest 005 解説 AtCoder株式会社 代表取締役 高橋 直大 2014/3/22 1
  2. 2. 競技プログラミングを始める前に • 競技プログラミングをやったことがない人へ – まずはこっちのスライドを見よう! – http://www.slideshare.net/chokudai/abc004 2014/3/22 2
  3. 3. ©AtCoder Inc. All rights reserved. 3 A問題 おいしいたこ焼きの作り方 1. 問題概要 2. アルゴリズム 2014/3/22 3
  4. 4. A問題 問題概要 • Yグラムの小麦粉がある。 • Xグラムの小麦粉につき、1個たこ焼きを作ることが 可能である • 最大いくつのたこ焼きを作ることが出来るか? 2014/3/22 4
  5. 5. A問題 アルゴリズム • 基本的なプログラムの流れ – 標準入力から、必要な入力を受け取る • 今回の場合は、x, yの2つの整数 – 問題で与えられた処理を行う • 今回は、yグラムの小麦粉でたこ焼きが何個作れるか算出する – 標準出力へ、答えを出力する 2014/3/22 5
  6. 6. A問題 アルゴリズム • 入力 – 2つの数字を、標準入力から受け取る • Cであれば、scanf(“%d %d”, &x, &y); など • C++であれば、cin >> x >> y; • 入力の受け取り方は、下記の練習問題に記載があります。 – http://practice.contest.atcoder.jp/tasks/practice_1 2014/3/22 6
  7. 7. A問題 アルゴリズム • Yグラムの小麦粉から、Xグラムで作れるたこ焼きを、 いくつ作れるか考える。 – これは、単純な算数の問題 • Y ÷ Xで求めることが出来る。 – 整数同士の演算なので、殆どの言語で勝手に小数点以 下は切り捨てられる。 – 小数で計算して、整数で出力、などをしてしまうと、四捨五 入された結果などが出力されてしまうことがあるのに注意 2014/3/22 7
  8. 8. A問題 アルゴリズム • 具体的な記述 – int ret = Y / X; のような感じ – 答えを格納する変数に、計算結果を入れておく 2014/3/22 8
  9. 9. A問題 アルゴリズム • 出力 – 求めた答えを、標準出力より出力する。 – 言語によって違います。 • printf(%d¥n, ret); (C) • cout << ret << endl; (C++) • System.out.println(ret); (Java) • 各言語の標準出力は、下記の練習問題に記載があります。 – http://practice.contest.atcoder.jp/tasks/practice_1 2014/3/22 9
  10. 10. ©AtCoder Inc. All rights reserved. 10 B問題 おいしいたこ焼きの食べ方 1. 問題概要 2. アルゴリズム 2014/3/22 10
  11. 11. B問題 問題概要 • たこ焼きがN個作られている • それぞれのたこ焼きが、何秒前に作られているかが 与えられる • 一番できたてのたこ焼きが、何秒前に出来ているか を出力しなさい 2014/3/22 11
  12. 12. B問題 アルゴリズム • 入力 – まずたこ焼きの数を表す整数Nを受け取る – 次に、長さNの配列を確保する • リストなどの動的な配列でも問題ない – N回のループを回す • それぞれのたこ焼きが、何秒後に出来ているかを配列に格納す る 2014/3/22 12
  13. 13. B問題 アルゴリズム • 処理 – 解法1:最小値を順番に探す • int ret = 9999999;など、大き目の値を答えに入れておく。 – Int ret = T[0]; など、最初の値を入れてもOK。 • ループを回し、1個ずつ、retより小さいかどうか調べる – If(ret > T[i]) ret = T[i]; – ret = min(ret, T[i]); – 解法2:ソートしてしまう • 配列に入っている値をソートする – Sort(T); みたいな。大抵の言語に標準で入っている。 • 最初の値を出力 2014/3/22 13
  14. 14. B問題 アルゴリズム • 出力 – A問題と同じく、答えを出力するだけ 2014/3/22 14
  15. 15. B問題 アルゴリズム • おまけ – 入力を配列に格納しなくても解ける • 解法1であれば、配列に格納していなくても、順番に数字を読んで いけば良い。 2014/3/22 15
  16. 16. ©AtCoder Inc. All rights reserved. 16 C問題 おいしいたこ焼きの売り方 1. 問題概要 2. アルゴリズム 2014/3/22 16
  17. 17. C問題 問題概要 • たこ焼きは、出来てからT秒以内に売らなければな らない。 • たこ焼きをN個作る – 各たこ焼きはA_i秒後に作成される • お客さんはM人くる – 各お客さんはB_j秒後に訪れる • 全てのお客さんに対し、作られてからT秒以内のた こ焼きを提供できるかどうかを出力しなさい。 2014/3/22 17
  18. 18. C問題 問題概要 • Sample5 T = 2 – 以下のように、客に対してたこ焼きを割り当てる 2014/3/22 18 1 3 6 10 15 4 8 16
  19. 19. C問題 問題概要 • T = 1になった場合 – 割り当てることが出来なかったら失敗 2014/3/22 19 1 3 6 10 15 4 8 16
  20. 20. C問題 アルゴリズム • 各お客さんに対し、どのたこ焼きを売るかを決める – M人のお客さんに、N個のたこ焼きを1つずつ割り当て る? – 組み合わせの数は、N! / (N-M)!通り。 • N,Mともに上限は100 • N=M=100の時、100!通り存在する • 2秒の制限時間で処理可能なのは、高速な言語でも 1億ループ程度まで。 – 全通りを試すことが出来ない! 2014/3/22 20
  21. 21. C問題 アルゴリズム • 実行時間を早くするためには? – 現在、明らかに無駄な組み合わせを大量に考えてしまっ ている – 無駄な組み合わせを取り除こう! 2014/3/22 21
  22. 22. C問題 アルゴリズム • 明らかに無駄なパターン1 – A < Bの時、A番目のお客さんのたこ焼きより、B番目のお 客さんのたこ焼きの方が新しいケースは、考えなくて良い • 後からきたお客さんに、先に来たお客さんよりも古いたこ焼きを 売る理由はない – これだと、パターン数は大幅に減る! • N個のたこ焼きから、M個のお客さんを選ぶ – これは N! / (M! * (N-M)!)通り – N=100, M=50が最大だが、これも非常に大きな数になってしまう – これでも間に合わないので、もう少し無駄なパターンを削 る 2014/3/22 22
  23. 23. C問題 アルゴリズム • 明らかに無駄なパターン2 – T秒以内に作られたたこ焼きの中で、最も古いたこ焼き以 外は考えなくても良い • そうした方が、後のお客さんの選択肢が増える • こうすると、実は売り方は1通りしかなくなってしまう – 売れるたこ焼きがあれば、最も古いものを売る – 売れるたこ焼きが無ければ、全員に対して、T秒以内に出 来たたこ焼きを全て売ることが出来ない。 2014/3/22 23
  24. 24. C問題 アルゴリズム • 実装の流れ – M人に対して、たこ焼きが売れるかどうかループを回して 判定を行う • N個のたこ焼きに対してループを回し、まだ売られていないもので、 T秒以内に作られたものがあるかどうかを探す – あれば、最も昔に作られたものを売る – なければ、noを出力して終了 – 全て売切れればyesを出力する – ループの最大数はN * M回くらいなので、100程度であれ ば十分間に合う 2014/3/22 24
  25. 25. C問題 アルゴリズム • おまけ1 – 実装を工夫すると、1 <= N, M <= 100,000でも間に合う – 工夫する点 • 前の人が食べたたこ焼きより、次の人が食べるたこ焼きは絶対に 後のものである • つまり、前の人が食べたたこ焼きの次のたこ焼きから調べて良い • さらに、早く作られたたこ焼きから順番に調べていき、売ることが 可能なたこ焼きが見つかったら、それより後のたこ焼きについて 調べる必要がない • こうすると、同じたこ焼きを複数人に対して調べることがなくなる • たこ焼き1つにつき調べる回数は1回なので、計算量はO(N)にな る 2014/3/22 25
  26. 26. C問題 アルゴリズム • 計算のイメージ – こんな感じで、調べる範囲が被らない 2014/3/22 26 1 3 6 10 15 4 8 16
  27. 27. C問題 アルゴリズム • おまけ2 – 二部グラフの最大マッチングでも解くことが可能 • ただし、大きなサイズになると解けない – 興味のある人は、以下のワードで検索 • 二部グラフ • 二部グラフの最大マッチング 2014/3/22 27
  28. 28. C問題 問題概要 • こんな感じのグラフを作って、フローをM流す – T = 5 のときのグラフ – 流せればyes、流せなければno 2014/3/22 28 1 3 6 10 15 4 8 16 S T
  29. 29. ©AtCoder Inc. All rights reserved. 29 D問題 おいしいたこ焼きの焼き方 1. 問題概要 2. アルゴリズム 2014/3/22 29
  30. 30. D問題 問題概要 • N*Nの正方形のたこ焼き器が存在する • 各マスでは1個のたこ焼きを作ることが可能で、その マスで作れるたこ焼きのおいしさは整数D_ijである • 店員がQ人存在し、各店員はP_k個のたこ焼きを一 度に焼くことが可能である。 • 一度に焼くたこ焼きの範囲は、x軸y軸に平行な長方 形になってなければならない • 各店員に対して、美味しいたこ焼きが焼けるかどう か答えなさい 2014/3/22 30
  31. 31. D問題 問題概要 • 各店員に対し、使うべき長方形が変わってくる 2014/3/22 31 2 2 1 2 2 1 1 1 1 9個 4個 1個
  32. 32. D問題 問題概要 • 各店員に対し、使うべき長方形が変わってくる – 美味しさの合計が最大になるときの合計値を出力 2014/3/22 32 2 2 1 2 2 1 1 1 1 9個 4個 1個 13 8 2
  33. 33. D問題 アルゴリズム • 普通に判定すると・・・? • 長方形の作り方は、縦の選び方がN * (N-1)通り、横 の選び方が N* (N-1)通りあるので、大凡N^4通り存 在する • これらに対して、おいしさの合計の計算をすると、調 べる必要のあるマス数は、最小で1マス、最大で N*Nマス • さらに、店員の人数がN*N人 • 計算量は、O(N^8)になってしまう。 – N <= 50なので、到底間に合わない! 2014/3/22 33
  34. 34. D問題 アルゴリズム • 長方形の中の数字の和を、高速に求めなくてはなら ない – 求め方はたくさんある! • 高速な求め方を考えよう! 2014/3/22 34
  35. 35. D問題 アルゴリズム • 解法1: 全ての長方形を一瞬で計算できるようにす る – 赤い部分を求めたい 2014/3/22 35
  36. 36. D問題 アルゴリズム • 解法1: 全ての長方形を一瞬で計算できるようにす る – 赤い部分を求めたい • まずはこの右下の部分までの青い部分を求め 2014/3/22 36
  37. 37. D問題 アルゴリズム • 解法1: 全ての長方形を一瞬で計算できるようにす る – 赤い部分を求めたい • まずはこの右下の部分までの青い部分を求め、緑の部分と 2014/3/22 37
  38. 38. D問題 アルゴリズム • 解法1: 全ての長方形を一瞬で計算できるようにす る – 赤い部分を求めたい • まずはこの右下の部分までの青い部分を求め、緑の部分と紫の 部分を引き、 2014/3/22 38
  39. 39. D問題 アルゴリズム • 解法1: 全ての長方形を一瞬で計算できるようにす る – 赤い部分を求めたい • まずはこの右下の部分までの青い部分を求め、緑の部分と紫の 部分を引き、オレンジの部分を足せば、赤い部分が求まる 2014/3/22 39
  40. 40. D問題 アルゴリズム • つまり、右下までの面積さえ予め求められれば、全 ての長方形の面積は、一瞬で求められる – じゃあ、どうやって予め計算するの? – パターンはN^2通りしかないので、O(N^4)で愚直に計算で きる • 上手くやるとO(N^2)でも計算できる! 2014/3/22 40
  41. 41. D問題 アルゴリズム • O(n^2)で上手くやる方法 – 赤い部分を求めたい 2014/3/22 41
  42. 42. D問題 アルゴリズム • O(n^2)で上手くやる方法 – 赤い部分を求めたい • 青い部分と 2014/3/22 42
  43. 43. D問題 アルゴリズム • O(n^2)で上手くやる方法 – 赤い部分を求めたい • 青い部分と緑の部分を足して、 2014/3/22 43
  44. 44. D問題 アルゴリズム • O(n^2)で上手くやる方法 – 赤い部分を求めたい • 青い部分と緑の部分を足して、紫の部分を引いた後、 2014/3/22 44
  45. 45. D問題 アルゴリズム • O(n^2)で上手くやる方法 – 赤い部分を求めたい • 青い部分と緑の部分を足して、紫の部分を引いた後、オレンジの 1マス部分だけ足してあげれば良い – よって、右下から順番に動的計画法で埋めていけば良い 2014/3/22 45
  46. 46. D問題 アルゴリズム • 解き方1 解き方と計算量まとめ – 右下まで必ず使う長方形を全通り列挙する O(n^2) • その長方形の美味しさの合計を列挙する O(1) – 各長方形を全通り列挙する O(n^4) • その長方形の美味しさの合計を列挙する O(1) – 全てのたこ焼きの数に対して、最大値が求められる 2014/3/22 46
  47. 47. D問題 アルゴリズム • 店員について – 1回の判定で、1からN*Nまでの全パターンについて考え てしまえば、全ての店員について、計算し終わった後に出 力すれば良い。 – よって、一人一人の店員に対して、全ての長方形を考え てあげる必要はない 2014/3/22 47
  48. 48. D問題 アルゴリズム • 以下のようなケースの場合、3個のたこ焼きを焼い た方が、4個のたこ焼きを焼くより良いパターンが存 在する 2014/3/22 48 1 1 1 1 1 1 9 9 9 1 2 3 9 18 27 4 5 6 20 0 30 7 8 9 0 0 33 たこ焼き数 美味しさ
  49. 49. D問題 アルゴリズム • 以下のようなケースの場合、3個のたこ焼きを焼い た方が、4個のたこ焼きを焼くより良いパターンが存 在する – 小さい方から順番に、これまでの最大値を塗りつぶしてい けば良い 2014/3/22 49 1 1 1 1 1 1 9 9 9 1 2 3 9 18 27 4 5 6 27 27 30 7 8 9 30 30 33 たこ焼き数 美味しさ
  50. 50. D問題 アルゴリズム • 解法2:計算順序を変えるだけで多少早くなる – 例えば、赤い部分を求めた後、青い部分を求めたい時 2014/3/22 50
  51. 51. D問題 アルゴリズム • 解法2:計算順序を変えるだけで多少早くなる – 例えば、赤い部分を求めた後、青い部分を求めたい時、 予め計算した赤い部分に、新しく増えた緑の部分を足せ ば良い 2014/3/22 51
  52. 52. D問題 アルゴリズム • 計算量の変化は? – 全部の長方形がO(N^4) • 和は、一回り小さい長方形から、1行足すだけで求められる。 • 1行足すコストは、最大Nマスなので、O(N) – これをさらに早くすることが出来る! 2014/3/22 52
  53. 53. D問題 アルゴリズム • この緑の部分を一瞬で求められるように、事前計算 をしておきたい。 – 1行の全列挙はパターン数もO(n^3)と少ないので、簡単に 計算可能 • 愚直でO(n^5) 解法2と同じ計算方法でO(n^4) 2014/3/22 53
  54. 54. D問題 アルゴリズム • おまけ 事前計算の高速な計算方法 – 先ほどと同じで、紫の部分からオレンジの部分を引くだけ • これは普通に後ろからループするだけで事前計算出来る。 – これがO(n^2) 2014/3/22 54
  55. 55. D問題 まとめ • 高速に計算するためには、計算するパーツの事前 計算が大切! 2014/3/22 55
  56. 56. D問題 おまけ • O(n^4)のアルゴリズムを紹介したが、O(n^5)でも間 に合う – 回答例2の、横のメモを使わないパターン – 愚直な計算で、横のメモだけ使うパターン 2014/3/22 56

×