63
競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto (MATYLA-PG, @Moneto_Tk) 10

競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

  • Upload
    others

  • View
    8

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

競技プログラミング頻出アルゴリズム攻略2016.01.13 Author: Moneto

(MATYLA-PG, @Moneto_Tk) 10

Page 2: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

whoami

•@Moneto_Tk

•JOI出場経験あり

•只の凡人老兵

Page 3: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

whoami

Page 4: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

whoami

Page 5: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

whoami

Page 6: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

競技プログラミングで必要な知識

Page 7: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

アルゴリズムの知識

著名な問題やその定石

「変な」テクニック

Page 8: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

「変な」テクニック

http://ichyo.jp/posts/2014-12-15-advent-calender/

Page 9: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

アルゴリズムの知識

著名な問題やその定石

Page 10: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

競技プログラミングで必要なアルゴリズムの知識

Page 11: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

競技プログラミングで必要なアルゴリズムの知識

Page 12: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

今日の内容はその中でも基本的なもの

Page 13: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DPDynamic Programming動的計画法

Page 14: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

BFSBreadth First Search幅優先探索

Page 15: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DFSDepth First Search深さ優先探索

Page 16: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

取り扱う基準•

Page 17: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DPDynamic Programming動的計画法

Page 18: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DP•

Page 19: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DP•

Page 20: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DP•

Page 21: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DP•

Page 22: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DP•

Page 23: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Tips

intの値を一瞬でも超えることが分かった時点で絶対にlong longを使おう

実力者でも気をつけるべきミス

Page 24: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DP•

Page 25: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Fib(n)•

public static Int64 fib_rec(int n)

{

if (n == 0) return 0;

else if (n == 1) return 1;

return fib_rec(n - 1) + fib_rec(n - 2);

}

Page 26: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Fib(n)•

public static Int64 fib_rec_m(int n)

{

if (n == 0) return 0;

else if (n == 1) return 1;

else if (table[n] != 0) return table[n];

else return table[n] = fib_rec_m(n - 1) + fib_rec_m(n - 2);

}

Page 27: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Fib(n)•

public static Int64 fib_dp(int n)

{

int[] dp = new int[n];

dp[0] = 1;

dp[1] = 1;

for (int i = 0; i < n - 2; i++)

{

dp[i + 2] = dp[i] + dp[i + 1];

}

return dp[n - 1];

}

Page 28: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Fib(n)

0 1

Page 29: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Fib(n)

0 1 1

Page 30: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Fib(n)

0 1 1 2

Page 31: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Fib(n)

0 1 1 2 3

Page 32: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Fib(n)

0 1 1 2 3 5 8 13 21 34

Page 33: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

BFSBreadth First Search幅優先探索

Page 34: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

BFS•

Page 35: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

BFS 1

Page 36: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

BFS 1

子ノードが見つかったらキューに格納

Page 37: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

BFS 1

2 3

子ノードが見つかったらキューに格納

Page 38: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

BFS 1

2 3

4 5

6 7

Page 39: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Best-First•

Page 40: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Best-First•

Page 41: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

RTS

http://neetpia.sakura.ne.jp/works/GensouSenryakutan/1.jpg

Page 42: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

RTS

http://neetpia.sakura.ne.jp/works/GensouSenryakutan/1.jpg

行き先を指定すると最適な移動経路を計算しその通りに移動してくれる

考慮するべき条件高低差(崖は迂回する)建造物、森林、河川など

Page 43: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DFSDepth First Search深さ優先探索

Page 44: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DFS•

Page 45: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DFS 1

Page 46: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DFS 1

2

分岐が見つかったらスタックに格納

Page 47: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DFS 1

2

3

分岐が見つかったらスタックに格納

Page 48: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DFS 1

2

3

4 分岐が見つかったらスタックに格納

Page 49: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DFS 1

2

3

4 5 スタックの処理順番「先入れ後出し」

Page 50: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

DFS 1

2 7

3 6

4 5

Page 51: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

根底の考え方はどれも簡単

Page 52: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

手頃な練習•

Page 53: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Tips•

Page 54: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

手頃な練習•

Page 55: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

手頃な練習•

Page 56: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

Tips•

Page 57: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

ICPCの国内強豪はJOI出身者が多い

Page 58: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

「JOI出身者」のレベルがいかに高いか

Page 59: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

ちょっと

Page 60: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

もうちょっと

Page 61: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

更にもうちょっと

Page 62: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

というわけで•

Page 63: 競技プログラミング 頻出アルゴリズム攻略matyla.info/labo/10_ProgAlgo.pdf · 競技プログラミング 頻出アルゴリズム攻略 2016.01.13 Author: Moneto

お疲れ様でした