会津合宿2015day3:d問題

25
会津大学競技プログラミング合宿2015 3日目 D問題 原案: 田中 問題文: 田中 解答: 青木, 井上, 鈴木, 田中 解説スライド: 田中

Upload: hcpc-

Post on 20-Jan-2017

360 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 会津合宿2015Day3:D問題

会津大学競技プログラミング合宿2015 3日目 D問題

原案: 田中問題文: 田中解答: 青木, 井上, 鈴木, 田中解説スライド: 田中

Page 2: 会津合宿2015Day3:D問題

問題

Page 3: 会津合宿2015Day3:D問題

問題概要プログラムと数列 が与えられるプログラムは 番目の関数を呼ぶ 番目の関数は次のどちらかを行う

を出力する 番目と 番目の関数を呼ぶ

どちらを行うかは毎回選べるプログラムはその数列を出力することができるか?

, … ,x1 xN

1i

ai

bi ci

Page 4: 会津合宿2015Day3:D問題

サンプル1数列:

を出力か , を出力か , を出力か ,

3, 5, 3() →f1 5 ()f2 ()f3() →f2 3 ()f3 ()f1() →f3 7 ()f1 ()f2

f1 →→→→→

,f2 f3

3, f3

3, ,f1 f2

3, 5, f2

3, 5, 3

Page 5: 会津合宿2015Day3:D問題

制約数列の長さ: 数列の要素: 関数の個数:

1 ≤ N ≤ 1000 ≤ ≤ 9xi

1 ≤ M ≤ 10

Page 6: 会津合宿2015Day3:D問題

簡単な解説1. 文脈自由文法の構文解析問題2. 文法はチョムスキー標準形で与えられる3. CYK アルゴリズム4. O( M)N 3

Page 7: 会津合宿2015Day3:D問題

詳しい解説

Page 8: 会津合宿2015Day3:D問題

方針1. 全探索すれば解けそう

解けるとは言っていない (TLE)探索途中で同じ計算をしている気がする

2. 結局やるのは DP なんな〜

Page 9: 会津合宿2015Day3:D問題

解説で使う表記 番目の関数が整数 を出力することを

番目の関数が 番目と 番目の関数を呼ぶことを

と表記する

i x→ xfi

i j k→fi fj fk

Page 10: 会津合宿2015Day3:D問題

可視化プログラムが数列を生成する様子をグラフで表す

f1

f2 f3

f2

f3

f1

f2

8

f1 f2

9

f2 f3

9 8 8 7

Page 11: 会津合宿2015Day3:D問題

可視化 を表す→f1 f2 f3

f1

f2 f3

f2

f3

f1

f2

8

f1 f2

9

f2 f3

9 8 8 7

Page 12: 会津合宿2015Day3:D問題

可視化 を表す→ 7f3

f1

f2 f3

f2

f3

f1

f2

8

f1 f2

9

f2 f3

9 8 8 7

Page 13: 会津合宿2015Day3:D問題

考察関数はある区間の数列を出力する

f1

f2 f3

f2

f3

f1

f2

8

f1 f2

9

f2 f3

9 8 8 7

Page 14: 会津合宿2015Day3:D問題

考察 が全区間の数列を出力できるか分かればよいf1

f1

f2 f3

f2

f3

f1

f2

8

f1 f2

9

f2 f3

9 8 8 7

Page 15: 会津合宿2015Day3:D問題

DPテーブルの設計 番目の関数が, 区間 の数列i [l, r]

, … ,xl xr

を出力できるかを dp[l][r][i] に保存

1. まず全要素を false にする2. 出力可能と分かった を true にしていく3. dp[0][N-1][0] が true になったら答えは Yes

区間 の数列を 番目の関数が生成可能

(l, r, i)

[0, N − 1] 0

Page 16: 会津合宿2015Day3:D問題

Q. まず求める区間は?A. のとき.l = r

区間 に対応する数列は 1個の整数を出力するのは の形の規則だけ

は必ず2個以上の整数を出力

[l, l] xl

→ xfi

→fi fj fk

?

8

?

9

?

9

?

8

?

8

?

7

Page 17: 会津合宿2015Day3:D問題

のときl = r となる を探す

見つかったら dp[l][l][i] を true に計算量は

について を探す各 に対して 個の関数を順に調べる

もちろん, 複数見つかることもある

→fi xl i

O(NM), … ,x1 xN fi

xl M

f2

8

f1

9

f1

9

f2

8

f2

8

f3

7

f4

Page 18: 会津合宿2015Day3:D問題

のときl < rもし, で, 下の図のようになっていたら...→f1 f2 f3

f2 f3

f2

f3

f1

f2

8

f1 f2

9

f2 f3

9 8 8 7

Page 19: 会津合宿2015Day3:D問題

のときl < rこうできるん!

f1

f2 f3

f2

f3

f1

f2

8

f1 f2

9

f2 f3

9 8 8 7

Page 20: 会津合宿2015Day3:D問題

のときl < r であり,→fi fj fk

(数列のピンクと黄色の境界)dp[l][p-1][j] が true (ピンクの部分)dp[p][r][k] が true (黄色の部分)

l < p ≤ r

となる が存在すれば dp[l][r][i] = truep

Page 21: 会津合宿2015Day3:D問題

テーブルの更新順序つまり, 隣接する2つの区間をマージしていく幅 ( ) のせまい区間から順に計算すればよいr − l + 1for (int width = 2; width <= N; ++width) { for (int l = 0; l + width - 1 < N; ++l) { int r = l + width - 1; for (int i = 0; i < M; ++i) { for (int p = l + 1; p <= r; ++p) { int j = b[i], k = c[i]; if (dp[l][p - 1][j] && dp[p][r][k]) { dp[l][r][i] = true; break; } } } }}

Page 22: 会津合宿2015Day3:D問題

の全体の計算量l < rO( M)N 3

を満たす は 通り に対して 個の関数を順に調べる

に対して調べる計算量は を満たす の個数に依存

l < r (l, r) O( )N 2

(l, r) M(l, r, )fi O(N)

l < p ≤ r p

Page 23: 会津合宿2015Day3:D問題

結論ボトムアップな DP で高速に求めることができる

同じテーブルを使ったメモ化再帰でも大丈夫メモ化再帰ならトップダウンでもできる

O(NM) + O( M) = O( M)N 3 N 3

Page 24: 会津合宿2015Day3:D問題

WRITER解青木 Java 43行井上 C++ 43行鈴木 C++ 35行田中 C++ 59行, Python 31行

Page 25: 会津合宿2015Day3:D問題

提出状況First Accept

onsite: yakzto さん (1:08)online: natsugiri さん (0:14)

正答率 18/27 (67 %)