Movatterモバイル変換


[0]ホーム

URL:


AI
Uploaded byAtCoder Inc.
13,101 views

実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)

実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)

Embed presentation

Downloaded 213 times
実践・最強最速のアルゴリズム勉強会第三回 講義資料AtCoder株式会社 代表取締役高橋 直大2014/3/23 1
はじめに!• 本講義では、ソースコードを扱います。• 前面の資料だけでは見えづらいかもしれないので、手元で閲覧できるようにしましょう。• URLはこちらから– http://www.slideshare.net/chokudai/wap-atcoder3– URLが打ちづらい場合は、Twitter: @chokudaiの最新発言から飛べるようにしておきます。• フォローもしてね!!!2014/3/23 2
©AtCoder Inc. All rights reserved. 3目次1. 勉強会の流れ2. 計算量の概念3. メモ化再帰4. 動的計画法5. 本日のまとめ2014/3/23 3
©AtCoder Inc. All rights reserved. 4勉強会の流れ1. 勉強会の日程2. 1日の流れ2014/3/23 4
勉強会の日程1日目 シミュレーションと全探索2日目 色々な全探索3日目 動的計画法とメモ化再帰4日目 動的計画法と計算量を減らす工夫5日目 難問に挑戦!2014/3/23 5
1日の流れ講義実践演習2014/3/23 6
1日の流れ• 基礎的なアルゴリズムを学ぶ• 必要な知識を補う講義• 実際に問題例を見る• コードでの表現方法を覚える実践• 自分で問題を解いてみる!• コードを書いて理解を深める演習2014/3/23 7
1日の流れ• 演習について– 実力差があると思うので、暇な時間が出来る人、ついていけない人、出ると思います。• どうしようもないので、早い人は支援に回ってもらえると嬉しいです!– 解らないことがあったら、#WAP_AtCoderでTwitterに投稿!• 多分早く終わった人が質問回答してくれます。• 具体例はこんな感じ– 「今やってる問題どれですか!」– 「この解答のWAが取れません! http:// ~~」– 「コンパイルエラー出るよーなんでー>< http:// ~~」– とりあえずコードが書けてたら、間違ってても提出してURLを貼りつけよう– もちろん、手を上げて質問してくれてもOK!• 回りきれる範囲では聞きに行きます。2014/3/23 8
©AtCoder Inc. All rights reserved. 9今日の流れ1. 前回までの復習2. 今回やること2014/3/23 9
前回までの復習• 全探索– 枝分かれの数が定数の場合 (第一回)• N重のforループによる全探索– 枝分かれの回数が不定の場合 (第二回)• 深さ優先探索• 幅優先探索• Bitを利用した深さ優先探索– 枝分かれが二股の時限定2014/3/23 10
今回やること• 計算量の概念– 計算時間を見積もれるようにしよう!• メモ化再帰– 深さ優先探索に対して、簡単に計算量を削減できる方法を覚えよう!• 動的計画法– メモ化再帰の逆向き、動的計画法を使いこなそう!2014/3/23 11
©AtCoder Inc. All rights reserved. 12今日の講義1. 計算量の概念2. メモ化再帰3. 動的計画法4. 本日のまとめ2014/3/23 12
©AtCoder Inc. All rights reserved. 13計算量の概念1. 計算時間を予測する必要性2. 計算量とは?3. 計算量を使用した実行時間の予測2014/3/23 13
計算時間を予測する必要性• プログラムを書いた! 実行!– 答えが返ってこない・・・。– TLEになってしまった!• こんなことって、ありませんか?• なぜ実行が終わらないのか?• バグ?• 正しくプログラムが組めていても、これだけ時間がかかってしまうアルゴリズムになっている?– 計算時間が予測出来ていないと、そもそもどうして実行時間がかかってしまっているのかが解らない2014/3/23 14
計算時間を予測する必要性• もしアルゴリズムが間違っていた場合• プログラムを最初から書き直さないといけなくなる– 出来れば、プログラムを書く前に計算時間を予測したい• とにかく、プログラムを書く前、プログラムを動かす前に、計算時間が解っていた方が、色々便利!2014/3/23 15
計算量とは?• forループだけで出来るソースコードの場合– 例えば上記のようなコードでは、最も深いループの場所が、N * M * L回実行される。2014/3/23 16
計算量とは?• 計算量とは?– 大体の計算時間を予測するために使う概念– 本来は、「nやmが無限に大きくなった時に、どのように計算時間が増えていくか」を見るためのもの– 先ほどの様な処理は、O(NML)と表せる。– このNMLの最大の値を具体的に計算することにより、計算時間を予測することが出来る• 今回の場合は、100 * 10 * 1000 = 1,000,0002014/3/23 17
計算量とは?• ループの回数と計算時間– 高速な言語の場合、おおよそ、1億回で1,2秒程度• 中の処理が本当に軽い処理の場合、10倍くらい早くなることも。• 計算量の違いと、Nの変化による中身の変化2014/3/23 18n 1 3 10 1000 10^8 10^16O(logn) 1 1 3 10 30 60O(√n) 1 1.7 3 31 10000 10^8O(n) 1 3 10 1000 10^8 10^16O(n^2) 1 9 100 10^6 10^16 10^32O(2^n) 1 8 1000 10^300 莫大 莫大
計算量とは?• ループの回数と計算時間– 高速な言語の場合、おおよそ、1億回で1,2秒程度• 中の処理が本当に軽い処理の場合、10倍くらい早くなることも。• 計算量の違いと、Nの変化による計算時間2014/3/23 19n 1 3 10 1000 10^8 10^16O(logn) 一瞬 一瞬 一瞬 一瞬 一瞬 一瞬O(√n) 一瞬 一瞬 一瞬 一瞬 0.001秒 1秒O(n) 一瞬 一瞬 一瞬 一瞬 1秒 3年O(n^2) 一瞬 一瞬 一瞬 0.01秒 3年 地球爆発O(2^n) 一瞬 一瞬 一瞬 地球爆発 地球爆発 地球爆発
計算量とは? 実践• ABC004 C問題 入れ替え– http://abc004.contest.atcoder.jp/tasks/abc004_3• 問題概要– 指定された順番でカードを入れ替える– n回入れ替えた時に、どのようなカードの並びになるか?• Nは1,000,000,000回まで! ←多い!2014/3/23 20
繰り返しのあるシミュレーション問題 おまけ2014/3/23 21
計算量とは? 実践• 単純に、言われた回数を入れ替えるだけだと?– N回のループを回す– 計算量はO(N)になる• Nは最大1,000,000,000• 大体10秒くらい?– ちょっと間に合わなさそう• 計算時間が予測出来れば、非常に便利!– 例えば、Nの最大値が10,000,000だったら、上記の解法で解けそう、などが解る。• 高精度ではないので、100,000,000だと微妙2014/3/23 22
計算量とは?• forループ以外の探索の計算量– これは見積もりが物凄く難しい!• 一応、幾つか見積もる方法はないわけではない。2014/3/23 23
計算量とは?• 分岐の数が一定などで、一番下の状態の数が予測可能な時– 計算量は、O(最終状態数 * 最終状態までの深さ)くらい2014/3/23 24: : : :……
計算量とは?• 凄く大雑把な見積もりをする場合– 分岐が最大P個、深さが最大Aなどの場合– 計算量はO(P * A^P)とかで見積もれる• これは大きすぎる見積もりとなる場合が多い• 見積もりが不可能な場合は、大抵は全探索出来ない程度に大きい場合が多い– 後で説明する、メモ化再帰などを使った方が、計算量が落ちる上、見積もりが簡単になる2014/3/23 25
©AtCoder Inc. All rights reserved. 26メモ化再帰1.深さ優先探索の限界2.メモ化再帰2014/3/23 26
深さ優先探索の限界• 深さ優先探索には、限界がある– 分岐の数などが多い場合に、実行時間が非常に長くなってしまう• これを解決するのがメモ化再帰!2014/3/23 27
メモ化再帰• メモ化再帰って?– 深さ優先探索の計算結果をメモ、再利用することによって、不必要な探索をしないようにするアルゴリズム• ここで言う「不必要な探索」とは、すでに探索を行っていて、同じ結果が得られることが容易に予想できる探索のこと– 不必要な探索って、例えばどんなのだろう?2014/3/23 28
メモ化再帰• 問題例– N人のりんごをM人で分けます。分け方が何通りあるか答えなさい。– 深さ優先探索では、全てのパターンを列挙した。2014/3/23 29
メモ化再帰• 例:4つのりんごを3人で分ける。2014/3/23 30dfs(4,3)dfs(4,2) dfs(3,2) dfs(2,2) dfs(1,2) dfs(0,2)4,1 3,1 2,1 1,1 0,1 3,1 2,1 1,1 0,1 2,1 1,1 0,111 1 1 15
メモ化再帰• 深さ優先探索の限界– 答えを1個ずつ列挙している• 答えが1億以上となる問題の場合、1億個以上のパターンを列挙している• つまり、ループ回数は1億を超えてしまう– よって、制限時間に間に合わない– メモ化再帰を使えば、この問題を解消できる2014/3/23 31
メモ化再帰• 例:4つのりんごを3人で分ける。2014/3/23 32dfs(4,3)dfs(4,2) dfs(3,2) dfs(2,2) dfs(1,2) dfs(0,2)4,1 3,1 2,1 1,1 0,1 3,1 2,1 1,1 0,1 2,1 1,1 0,111 1 1 15
メモ化再帰• 図のように、dfs(2,1)を何度も呼び出している– 何度呼び出されても、dfs(2,1)が返す値は変わらない• なぜなら、dfs(N,M)は、「N人のリンゴをM人で分ける時の組み合わせ」を必ず返す関数として作成しているから。– であれば、dfs(2,1)の値をメモしておけば、dfs(2,1)の値は、2回目から計算する必要がない。• これは、他のdfs(A, B)に対しても言える2014/3/23 33
メモ化再帰• 実装例– 前回の深さ優先探索のソースコード2014/3/23 34
メモ化再帰• 実装例– メモ化再帰のソースコード2014/3/23 35
メモ化再帰• 実装例– メモ化再帰のソースコード2014/3/23 36答えをメモをするための配列を予め用意しておく
メモ化再帰• 実装例– メモ化再帰のソースコード2014/3/23 37答えを返す時に、必ずメモ用の配列に答えを入力しながら返すようにする
メモ化再帰• 実装例– メモ化再帰のソースコード2014/3/23 38答えが既に求まっていればその答えをそのまま返す。今回は0を初期値として利用したが、毎回0で良いわけではない。その数になり得ない数を入れる。そうした数が存在しない時は既に求めたかのチェック用の配列を別に用意する。
メモ化再帰• メモ化再帰で何をメモすれば良いか?• その関数で求めるべきもの!– 最小値・最大値を求める問題• その引数に対する最小値・最大値をメモする– 組み合わせの個数を求める問題• その引数に対する組み合わせの個数をメモする– 他にも何パターンか存在するが、基本的には、求めたいものを返す関数を作って、その結果をそのままメモすれば良い!2014/3/23 39
メモ化再帰 実践• 天下一プログラマーコンテスト2012決勝 A問題– http://tenka1-2012-final.contest.atcoder.jp/tasks/tenka1_2012_final_a• 難しい方は解けないので、部分点だけ解きましょう。• 問題概要– 整数n (1 <= n <= 10^5)が与えられる– フィボナッチ数列に出てくる数字の和だけでnを作りたい。– 使う数字の数を出来るだけ減らしたい時、使う必要のある数字の数の最小数を求めなさい。• 同じ数を2回使っても、2つとカウントします。2014/3/23 40
メモ化再帰 実践• フィボナッチ数って?– F(n) = F(n-1) + F(n-2)となる数列• 簡単に言うと、1つ前の数字と2つ前の数字を足した数字が次の数字になるよ、って数列• 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233… みたいな感じ。• 最初の2つだけは、0,1と決まっている。あとは計算で求める• 具体例– N = 10だと、5 + 5で表せるので、答えは2– N = 11でも、8 + 3で表せるので、答えは22014/3/23 41
メモ化再帰 実践• まずはk番目のフィボナッチ数を求める– せっかくなので、これもメモ化再帰で求めてみる• 適当にフィボナッチ関数を、深さ優先探索で書くとこんな感じ– 0や1の2つ目が出てきても仕方ないので、1,2から始める2014/3/23 42
メモ化再帰 実践• さっきのコードをメモ化再帰にしてみる2014/3/23 43
メモ化再帰 実践• さっきのコードをメモ化再帰にしてみる2014/3/23 44答えをメモするための配列
メモ化再帰 実践• さっきのコードをメモ化再帰にしてみる2014/3/23 45返す答えを配列にメモする
メモ化再帰 実践• さっきのコードをメモ化再帰にしてみる2014/3/23 46答えがメモ済みであれば返す!
メモ化再帰• フィボナッチ数を求める計算量は?– k番目のフィボナッチ数を求めるために探索をする回数は、各々1回しか存在しない。– よって、フィボナッチ数の数の分の計算量しかかからない。• 2回同じものを呼び出した場合、既に求まっているので、配列に入った答えを返すだけ。• ちなみに、メモ化再帰なしだと、帰ってくる数値分の探索はおおよそしている、と推定できる。– すぐに非常に大きな数になってしまう2014/3/23 47
メモ化再帰 実践• 次に、求めたい答えを探索する。– ある数字kを作るために必要な手数を、深さ優先探索で求める再帰関数dfsを作る!2014/3/23 48
メモ化再帰 実践• この深さ優先探索の計算量は?– よくわからない!– けど莫大になりそう!• という感覚だけ持っていれば良いです– 計算量が良くわからない時は、大体凄く多いです。2014/3/23 49
メモ化再帰 実践• これをメモ化再帰に改造する2014/3/23 50
メモ化再帰 実践• これをメモ化再帰に改造する– 変更した箇所はたったこれだけ!2014/3/23 51
メモ化再帰 実践• メモ化再帰にしたときの計算量は?– N個の数に対して、探索する回数は1回だけ– 100000以下のフィボナッチ数はせいぜい20個くらい– よって、計算回数は、20*N程度で済む– これなら計算が間に合う!2014/3/23 52
メモ化再帰 実践• ソースコード– http://tenka1-2012-final.contest.atcoder.jp/submissions/1484062014/3/23 53
メモ化再帰 演習• 第2回早稲田大学プログラミングコンテスト B問題– http://wupc2nd.contest.atcoder.jp/tasks/wupc_02• 問題概要– 水たまりのあるマスと、ないマスが存在する• .X.XXXXXX.のような、文字列で情報が与えられる– Xは水たまりのある場所– .は水たまりのない場所– 出来る行動は、1~3マス右に進む– 一番左から一番右のマスに移動する時、水たまりに入らなければならない最小値を出力せよ。2014/3/23 54
メモ化再帰 演習• 問題のイメージ– 例えば以下のような水たまりが与えられる2014/3/23 55
メモ化再帰 演習• 問題のイメージ– 例えば以下のような水たまりが与えられる– 以下のように移動すれば、1回の水たまりでゴールすることが出来る2014/3/23 56
メモ化再帰 演習• 探索をすると・・・?– 区間は100以下– この区間に対して、1,2,3個の3つの選択肢の移動が考えられる。– 大きく見積もって、O(3^N)– 適当に深さの平均がN/2になりそうであるという予測を立てても、探索回数が3^(N/2)くらいになるので、莫大な数になってしまう– メモ化再帰にする必要があります!2014/3/23 57
メモ化再帰 演習• 注意点– 今回は、答えとして、0が帰ってくることがあり得る– 0で初期化してしまうと、正常にメモすることが出来ない。– 配列の使ってない部分は、予め-1などで初期化しておこう2014/3/23 58
メモ化再帰 演習• 出来た人は以下の問題にもチャレンジ!– Recruit Programming Contest 模擬練習会 B問題• http://recruit-programing-contest-practice.contest.atcoder.jp/tasks/recruite_2013_pre_b– Typical DP Contest C問題• http://tdpc.contest.atcoder.jp/tasks/tdpc_tournament2014/3/23 59
メモ化再帰 演習 ヒント• 作るべき関数– あと残り何マスの時に、あと何回の水たまりに入るとゴール出来るか?» 今いるマスが何マスの時に、でも良い。» 解説はそっちで実装します。• 今いる場所が水たまりである場合、それも含めた関数にする方が組みやすい2014/3/23 60
メモ化再帰 演習 解説• kマス目にいるときに、残りの水たまりに入らないといけない回数を求める関数int dfs(int k)を作る!2014/3/23 61
メモ化再帰 演習 解説• これをメモ化再帰に改造する!2014/3/23 62
メモ化再帰 演習 解説• これをメモ化再帰に改造する!– 変わった箇所は以下の箇所2014/3/23 63
メモ化再帰 演習 解説• ソースコード– http://wupc2nd.contest.atcoder.jp/submissions/1484082014/3/23 64
メモ化再帰 演習 解説• メモ化再帰の注意点– 元々は深さ優先探索なので、メモ化が上手くいってなくても、小さいケースでは正しい答えを出してしまう。• よって、大きいケースでTLEするコードになってしまっていても、なかなか気づけない– 提出前に、必ず大きな入力のテストをするようにしよう!2014/3/23 65
©AtCoder Inc. All rights reserved. 66休憩!2014/3/23 66
©AtCoder Inc. All rights reserved. 67動的計画法1.動的計画法って?2.メモ化再帰と深さ優先探索の関係3.動的計画法2014/3/23 67
動的計画法って?• これまでの結果を全て纏めておくことにより、同じ探索を2度しないアルゴリズム– 略称はDP– といっても、イメージは付きづらい?• 具体例を見たほうが早い!2014/3/23 68
動的計画法って?• フィボナッチ数列を求めるアルゴリズム– f(0) = 1, f(1) = 1とする– f(2) = f(0) + f(1) = 2– f(3) = f(1) + f(2) = 3– ….• 前の状態を予め計算しておくことで、次の値をすぐに求めることが可能になる。2014/3/23 69
動的計画法って?• AからBに行く方法は何通り?– ただし遠回りをするのは禁止とする2014/3/23 70
動的計画法って?• AからBに行く方法は何通り?– ただし遠回りをするのは禁止とする• たてに4回、よこに5回で9回の移動– 9回から4回を選べば良いので、9C4回• 数学的に求まる2014/3/23 71
動的計画法って?• AからBに行く方法は何通り?– ただし遠回りをするのは禁止とする• 通れない道があるので、数学的に求まらない!2014/3/23 72
動的計画法って?• 動的計画法の考え方– 「その場所にいくまで」の情報をメモする• ○○まで何通りあるか• ○○までの最大値はいくつか• ○○までの最短距離はいくつか• ○○まで到達可能か– その情報から、次の場所を埋めていく2014/3/23 73
動的計画法って?• AからBに行く方法は何通り?– ただし遠回りをするのは禁止とする– 左下から順番に埋めていく2014/3/23 741最初は1通り
動的計画法って?• AからBに行く方法は何通り?– ただし遠回りをするのは禁止とする– 左下から順番に埋めていく2014/3/23 751このマスにくるパターンも、右に移動する1パターンだけ1
動的計画法って?• AからBに行く方法は何通り?– ただし遠回りをするのは禁止とする– 左下から順番に埋めていく2014/3/23 761同様に、順番にここまで埋める1 1 1 1 11
動的計画法って?• AからBに行く方法は何通り?– ただし遠回りをするのは禁止とする– 左下から順番に埋めていく2014/3/23 771このマスに到達するのは、・左からの移動→1ルート・下からの移動→1ルートの合計2ルート。足し算をすることで計算が可能1 1 1 1 11 2
動的計画法って?• AからBに行く方法は何通り?– ただし遠回りをするのは禁止とする– 左下から順番に埋めていく2014/3/23 781このマスに到達するのは、・左からの移動→1ルート・下からの移動→1ルートの合計2ルート。足し算をすることで計算が可能1 1 1 1 11 2
動的計画法って?• AからBに行く方法は何通り?– ただし遠回りをするのは禁止とする– 左下から順番に埋めていく2014/3/23 791最後まで埋めると答えが解る1 1 1 1 11 2 0 1 2 31 3 3 4 31 3 7 7 101 1 4 11 18 28
動的計画法って?• ソースコード2014/3/23 80
動的計画法って?• ソースコード2014/3/23 81初期値に1を入れる
動的計画法って?• ソースコード2014/3/23 82侵入不可能マスならcontinue
動的計画法って?• ソースコード2014/3/23 83下から増やす処理、左から増やす処理を順番に行う
動的計画法って?• ソースコード22014/3/23 84
動的計画法って?• ソースコード22014/3/23 85上へ増やす処理、右に増やす処理を順番に行う
動的計画法って?• ソースコード1とソースコード2の違い– 1は、下や左から、数値を「もらう」動的計画法• 「もらうDP」などと呼ばれている– 2は、上や右に、数値を「くばる」動的計画法• 「配るDP」などと呼ばれている– 大抵の場合はどっちで実装しても良い• 書き易い方を書きましょう2014/3/23 86
動的計画法って?• 動的計画法のポイントはここ!– 今までの計算結果をメモしておく– 同じ計算結果は纏めてしまう• 組み合わせの個数であれば足し算。最大値や最小値であれば、最大値や最小値だけ使う– これらを守って実装すれば、メモ化再帰より実装は簡単2014/3/23 87
動的計画法とメモ化再帰の関係性• 先に2つ上げた2つの問題は、メモ化再帰でも解くことが可能– フィボナッチ数列は先に挙げた通り– メモ化再帰は、残り縦移動回数と横移動回数を引数とした再帰関数 int dfs(int n, int m)を作ってあげれば良い。• 動的計画法は、「ここまでの計算結果」をメモする。• メモ化再帰は、「ここから先の計算結果」をメモする。• やってることは逆なので、向きを変えると同じになる– スタートからゴールに動的計画法を行うのは、ゴールからスタートにメモ化再帰するのと同じ2014/3/23 88
動的計画法 実践• 第2回早稲田大学プログラミングコンテスト B問題– http://wupc2nd.contest.atcoder.jp/tasks/wupc_02– 先ほど解いた水たまりの問題2014/3/23 89
動的計画法 実践• 実装方針– k番目のマスに辿り着いた時の、水たまりを通る最小の数を計算すれば良い– これを、動的計画法で計算する2014/3/23 90
動的計画法 実践• 具体的な実装(貰うDPの場合)2014/3/23 91
動的計画法 実践• 具体的な実装(貰うDPの場合)– まず、初期値には0が入る2014/3/23 920
動的計画法 実践• 具体的な実装(貰うDPの場合)– まず、初期値には0が入る– 次のマスは、そこに辿り着くための全てのマスの最小値を取る2014/3/23 930 0
動的計画法 実践• 具体的な実装(貰うDPの場合)– まず、初期値には0が入る– 次のマスは、そこに辿り着くための全てのマスの最小値を取る– 水たまりのマスは、その値にさらに1を足す2014/3/23 940 0 1
動的計画法 実践• 具体的な実装(貰うDPの場合)– まず、初期値には0が入る– 次のマスは、そこに辿り着くための全てのマスの最小値を取る– 水たまりのマスは、その値にさらに1を足す– 以下を繰り返して最後のマスまで計算する2014/3/23 950 0 1 0 1 1 0 1 1 1 1 1
動的計画法 実践• 具体的な実装(配るDPの場合)– 初期値に0を入れる2014/3/23 960
動的計画法 実践• 具体的な実装(配るDPの場合)– 初期値に0を入れる– 次のマスに対し、解候補を入れてあげる• 水たまりがあったら1を足す• 最小値をメモするので、前入っている値の方が小さかったら変化させない– 事前には999などの大きい値を入れておく2014/3/23 970 0 1 0
動的計画法 実践• ソースコード(貰うDP)– http://wupc2nd.contest.atcoder.jp/submissions/1484122014/3/23 98
動的計画法 実践• ソースコード(配るDP)– http://wupc2nd.contest.atcoder.jp/submissions/1484102014/3/23 99
動的計画法 演習• 早稲田大学プログラミングコンテスト 2012 D問題– http://wupc2012.contest.atcoder.jp/tasks/wupc2012_4• 問題概要– 整数Nが与えられる– 高さNの三角形型の数字のデータが与えられる– 上から順番に下に移動しながら数字を辿っていく– 数字の和を最大にしたい時、その値を求めなさい。2014/3/23 100
動的計画法 演習• 問題概要– 下記の様なデータが与えられる– 上から順番に下りながら数字を拾っていく– 取れ得る数字の和の最大値を出力しなさい2014/3/23 10137 42 4 68 5 9 3
動的計画法 演習• 出来た人は以下の問題にも挑戦!• Typical DP Contest A問題 コンテスト– http://tdpc.contest.atcoder.jp/tasks/tdpc_contest• Typical DP Contest B問題 ゲーム– http://tdpc.contest.atcoder.jp/tasks/tdpc_game• AtCoder Regular Contest 005 D問題 連射王高橋君– http://arc005.contest.atcoder.jp/tasks/arc005_4• 激ムズ注意!2014/3/23 102
動的計画法 演習 ヒント• 動的計画法がイメージつかないのであれば、メモ化再帰でもOK!• 「この場所に辿り着くまでにいくつの数字を獲得できたか」をメモするのが動的計画法• 「この場所から残りいくつの数字を獲得できるか」をメモするのがメモ化再帰– 好きな方を組もう!2014/3/23 103
動的計画法 演習 解説• 今見ている数字に対して、ここまでの数字の和の最大値が得られれば良い– それを念頭に入れて、動的計画法を組めば良い• 今回は貰うDPが一番書き易そう?2014/3/23 104
動的計画法 演習• 動的計画法(貰うDP)のイメージ– 中央の4の値を知るには、上の7,4の2つの経路の最大値を取ってきて、それに4を足せば良い。2014/3/23 10537 42 4 68 5 9 3
動的計画法 演習• ソースコード(貰うDP)– http://wupc2012.contest.atcoder.jp/submissions/1484152014/3/23 106
動的計画法 演習• ソースコード(貰うDP)2014/3/23 107
動的計画法 演習• もちろん、メモ化再帰や配るDPで書いてもOK!– 書き易いものを使いましょう!2014/3/23 108
©AtCoder Inc. All rights reserved. 109本日のまとめ2014/3/23 109
本日のまとめ• 計算量– 大体の計算時間が予測出来るようになった!• メモ化再帰– 深さ優先探索を、一瞬で高速化出来る魔法のツール– 探索の計算量も見積もりやすくなった• 動的計画法– メモ化再帰と対になる概念– こちらも計算時間を大幅に短縮できる!2014/3/23 110

Recommended

PDF
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
PDF
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
PDF
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
PDF
プログラミングコンテストでのデータ構造
PDF
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
PDF
双対性
PDF
AtCoder Beginner Contest 035 解説
PPTX
CODE FESTIVAL 2014 本選 解説
PDF
AtCoder Beginner Contest 030 解説
PDF
AtCoder Regular Contest 045 解説
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PDF
最小カットを使って「燃やす埋める問題」を解く
PDF
グラフネットワーク〜フロー&カット〜
PDF
AtCoder Regular Contest 042 解説
PDF
AtCoder Regular Contest 037 解説
PDF
AtCoder Beginner Contest 021 解説
PDF
平面グラフと交通ネットワークのアルゴリズム
PDF
ユークリッド最小全域木
PDF
AtCoder Regular Contest 039 解説
PPTX
Chokudai search
PDF
アルゴリズムのイメージを擬人化する
PDF
LCA and RMQ ~簡潔もあるよ!~
PDF
プログラミングコンテストでの動的計画法
PDF
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
PDF
社内勉強会 2014/10/08

More Related Content

PDF
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
PDF
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
PDF
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
PDF
プログラミングコンテストでのデータ構造
PDF
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
PDF
双対性
PDF
AtCoder Beginner Contest 035 解説
実践・最強最速のアルゴリズム勉強会 第四回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第二回講義資料(ワークスアプリケーションズ & AtCoder)
実践・最強最速のアルゴリズム勉強会 第一回 講義資料(ワークスアプリケーションズ & AtCoder)
プログラミングコンテストでのデータ構造
二部グラフの最小点被覆と最大安定集合と最小辺被覆の求め方
双対性
AtCoder Beginner Contest 035 解説

What's hot

PPTX
CODE FESTIVAL 2014 本選 解説
PDF
AtCoder Beginner Contest 030 解説
PDF
AtCoder Regular Contest 045 解説
PDF
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
PDF
最小カットを使って「燃やす埋める問題」を解く
PDF
グラフネットワーク〜フロー&カット〜
PDF
AtCoder Regular Contest 042 解説
PDF
AtCoder Regular Contest 037 解説
PDF
AtCoder Beginner Contest 021 解説
PDF
平面グラフと交通ネットワークのアルゴリズム
PDF
ユークリッド最小全域木
PDF
AtCoder Regular Contest 039 解説
PPTX
Chokudai search
PDF
アルゴリズムのイメージを擬人化する
PDF
LCA and RMQ ~簡潔もあるよ!~
PDF
プログラミングコンテストでの動的計画法
CODE FESTIVAL 2014 本選 解説
AtCoder Beginner Contest 030 解説
AtCoder Regular Contest 045 解説
プログラミングコンテストでのデータ構造 2 ~平衡二分探索木編~
最小カットを使って「燃やす埋める問題」を解く
グラフネットワーク〜フロー&カット〜
AtCoder Regular Contest 042 解説
AtCoder Regular Contest 037 解説
AtCoder Beginner Contest 021 解説
平面グラフと交通ネットワークのアルゴリズム
ユークリッド最小全域木
AtCoder Regular Contest 039 解説
Chokudai search
アルゴリズムのイメージを擬人化する
LCA and RMQ ~簡潔もあるよ!~
プログラミングコンテストでの動的計画法

Similar to 実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)

PDF
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
PDF
社内勉強会 2014/10/08
PPTX
純粋関数型アルゴリズム入門
PDF
AtCoder Beginner Contest 006 解説
PDF
第21回アルゴリズム勉強会
PDF
AtCoder Beginner Contest 011 解説
PDF
CODE THANKS FESTIVAL 2014 A日程 解説
PPT
Algorithm 速いアルゴリズムを書くための基礎
PPTX
AtCoder Beginner Contest 012 解説
PDF
WUPC2012
PDF
Abc009
PDF
AtCoder Beginner Contest 009 解説
PDF
AtCoder Beginner Contest 015 解説
PDF
第22回アルゴリズム勉強会資料
PDF
AtCoder Beginner Contest 020 解説
PDF
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
PDF
第24回アルゴリズム勉強会資料
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
PDF
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
PDF
最適化の手前の数学
実践・最強最速のアルゴリズム勉強会 第五回講義資料(ワークスアプリケーションズ & AtCoder)
社内勉強会 2014/10/08
純粋関数型アルゴリズム入門
AtCoder Beginner Contest 006 解説
第21回アルゴリズム勉強会
AtCoder Beginner Contest 011 解説
CODE THANKS FESTIVAL 2014 A日程 解説
Algorithm 速いアルゴリズムを書くための基礎
AtCoder Beginner Contest 012 解説
WUPC2012
Abc009
AtCoder Beginner Contest 009 解説
AtCoder Beginner Contest 015 解説
第22回アルゴリズム勉強会資料
AtCoder Beginner Contest 020 解説
『問題解決力を鍛える!アルゴリズムとデータ構造』出版記念講演
第24回アルゴリズム勉強会資料
Java SE 8 lambdaで変わる プログラミングスタイル
区間分割の仕方を最適化する動的計画法 (JOI 2021 夏季セミナー)
最適化の手前の数学

More from AtCoder Inc.

PPTX
TCO2017R1
PPTX
AtCoderに毎回参加したくなる仕組み
PDF
Square869120 contest #2
PDF
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
PDF
Chokudai Contest 001
PDF
AtCoder Regular Contest 049 解説
PPTX
AtCoder Beginner Contest 034 解説
PDF
AtCoder Regular Contest 048
PDF
MUJINプログラミングチャレンジ2016 解説
PDF
AtCoder Beginner Contest 033 解説
PDF
DDPC 2016 予選 解説
PDF
arc047
PDF
abc032
PDF
CODE FESTIVAL 2015 沖縄ツアー 解説
PDF
AtCoder Regular Contest 046
PDF
abc031
PDF
CODE FESTIVAL 2015 解説
PDF
CODE FESTIVAL 2015 予選B 解説
PDF
CODE FESTIVAL 2015 予選A 解説
PDF
AtCoder Beginner Contest 029 解説
TCO2017R1
AtCoderに毎回参加したくなる仕組み
Square869120 contest #2
Disco Presents ディスカバリーチャンネルプログラミングコンテスト2016 本選 解説
Chokudai Contest 001
AtCoder Regular Contest 049 解説
AtCoder Beginner Contest 034 解説
AtCoder Regular Contest 048
MUJINプログラミングチャレンジ2016 解説
AtCoder Beginner Contest 033 解説
DDPC 2016 予選 解説
arc047
abc032
CODE FESTIVAL 2015 沖縄ツアー 解説
AtCoder Regular Contest 046
abc031
CODE FESTIVAL 2015 解説
CODE FESTIVAL 2015 予選B 解説
CODE FESTIVAL 2015 予選A 解説
AtCoder Beginner Contest 029 解説

Recently uploaded

PDF
プログラミング講座 【小学校高学年向け】Revision 6 2025/11/30
PDF
ふみこんで学ぶ世界遺産700<第2版>世界遺産検定準1級公式テキスト(2026年発売)
PDF
横浜国立大学3年生に向けて研究室を紹介する資料【2026年度研究室配属について】
PPTX
Introduction to Japanese Language Learning.pptx
PDF
高等専門学校卒業資格における準学士学位 (Associate Degre) の制度的展望 —国際的学位制度との比較から—
PDF
横浜国立大学3年生に向けて研究室を紹介するスライド【2026年度研究室配属について】
プログラミング講座 【小学校高学年向け】Revision 6 2025/11/30
ふみこんで学ぶ世界遺産700<第2版>世界遺産検定準1級公式テキスト(2026年発売)
横浜国立大学3年生に向けて研究室を紹介する資料【2026年度研究室配属について】
Introduction to Japanese Language Learning.pptx
高等専門学校卒業資格における準学士学位 (Associate Degre) の制度的展望 —国際的学位制度との比較から—
横浜国立大学3年生に向けて研究室を紹介するスライド【2026年度研究室配属について】

実践・最強最速のアルゴリズム勉強会 第三回講義資料(ワークスアプリケーションズ & AtCoder)


[8]ページ先頭

©2009-2025 Movatter.jp