53
難しい典型テクとか Slides for IOI2015 Japan Team

直前合宿 講義スライド

Embed Size (px)

Citation preview

難しい典型テクとか

Slides for IOI2015 Japan Team

注意事項

写真が入っていた空間には代わりに写真のURLを載せたので気分を楽しんでください。

Contents

・変なDPmongeとか

・分割統治

これらの手法の個人的イメージ

・典型テクではある

・とはいえ使いどころが非自明

・使う必要を出そうと思うと難しい問題になりがち

・なかなかこういう問題は作られない

・経験が積みにくい

これらの手法の個人的イメージ

・典型テクではある

・とはいえ使いどころが非自明

・中でやってることも単純じゃないことが多い

・なかなかこういう問題は作られない

・経験が積みにくい

練習しにくい二分探索的ポジション

Contents

・変なDPmongeとか

・分割統治

http://www.ioi-jp.org/ioi/2012/9-26/gardaland5.jpg

DP Optimization

読むべき資料(数式が苦手なので読めていない)・http://topcoder.g.hatena.ne.jp/spaghetti_source/20120915

・http://codeforces.com/blog/entry/8219

http://www.ioi-jp.org/ioi/2013/7-06/sydney1.jpg

Most Typical DP Optimization

一番多いパターンはこんな感じの

dp[i][j]=max{dp[i-1][k]+都合のよい関数}ただし、dp[i][j]を決めることになったkよりもdp[i][j+1]を決めることになったkが小さくはならない

→変な順でdpテーブルを埋めると計算量が落ちる

Telephone Wire (PKU 3612)

dp[i][j]=min{dp[i-1][k]+C×abs(j-k)+(h[i]-j)2}(j≧h[i]のみ埋める)

A[i][j]:= (dp[i][j]を決定付けるkの値)とすると A[i][j] ≦ A[i][j+1] が容易に想像つく

あと、凸性も持っている(…≧≧≧≧≦≦≦≦…みたいな感じ)

Telephone Wire (PKU 3612)

どういう方法で高速化できるか

・dp[i][j]を、dp[i-1][k]+C×abs(j-k)+(h[i]-j)2をkが小さい順に計算

・途中で一つ前より大きくなってしまったらやめる

・大きくなる前のkからdp[i][j+1]を計算

・以下繰り返し

514

j

k

514 114

j

k

514 114 810

j

k

514 114 810

364j

k

514 114 810

364 364j

k

514 114 810

364 364 334j

k

514 114 810

364 364 334 1919j

k

514 114 810

364 364 334 1919

893

j

k

514 114 810

364 364 334 1919

893 114514

j

k

514 114 810

364 364 334 1919

893 114514

33

j

k

514 114 810

364 364 334 1919

893 114514

33 4

j

k

514 114 810

364 364 334 1919

893 114514

33 4 1000000007

j

k

Sashimi (AOJ 2415)

・次の区間DPをO(N2)で全部埋めたい

dp[i][j]=mini≦k<j{dp[i][k]+dp[k][j]}+sum(i,j)

Sashimi (AOJ 2415)

数式がやってることをイメージする

dp[i][j]=mini≦k<j{dp[i][k]+dp[k][j]}+sum(i,j)iがi-1になったりjがj+1になったら最適にするkの値はどう変化するか?

A[i][j]:= (dp[i][k]+dp[k][j]を最小とするkの値)とするとA[i-1][j] ≦ A[i][j] ≦ A[i][j+1]が成り立ちそう(???????)

Sashimi (AOJ 2415)

数式がやってることをイメージする

dp[i][j]=mini≦k<j{dp[i][k]+dp[k][j]}+sum(i,j)iがi-1になったりjがj+1になったら最適にするkの値はどう変化するか?

A[i][j]:= (dp[i][k]+dp[k][j]を最小とするkの値)とするとA[i-1][j] ≦ A[i][j] ≦ A[i][j+1]が成り立ちそう(???????)

脳内でイメージしよう!

詳しい条件

ちなみにA[i-1][j] ≦ A[i][j] ≦ A[i][j+1]が成り立つ十分条件としては、

a≦b≦c≦dのとき、

・C[a][c]+C[b][d] ≦ C[a][d]+C[b][c]・C[b][c]≦C[a][d]が成り立つというものが有名

DPテーブルの更新の仕方

・dp[i][j]をj-iが小さい順に更新していく

・配列A[i][j]を別に用意する

・dp[i][i]=0, A[i][i]=iがスタート

0

1

2

3

i

j初期状態

0

1

2

3

i

j0≦k≦1を試す

0 0

1

2

3

i

j1≦k≦2を試す

0 0

1 2

2

3

i

j2≦k≦3を試す

0 0

1 2

2 2

3

i

j0≦k≦2を試す

0 0 1

1 2

2 2

3

i

j2≦k≦2を試す

0 0 1

1 2 2

2 2

3

i

j1≦k≦2を試す

0 0 1 1

1 2 2

2 2

3

i

j各j-iの値ごとにO(N)かかるので合計O(N2)

Buffed Buffet (ICPC WF2014 B)

N種類の食べ物があり、1個あたり重さwiで、k個目を食べたとき満足度はvi-(k-1)Δvi上昇する。

食べたものの重さの合計が0~wになるときのそれぞれの満足度の最大値を求めよ。

N≦250, W≦10,0000≦vi, Δvi

Buffed Buffet (ICPC WF2014 B)

dp[i][j]:=i種類目まで合計重さjのときの最大値

普通に計算するとO(NW2)で遅い

今まで見たとおり疑ってかかるべき点は

A[i][j]≦A[i][j+1]が成り立つかどうか

Buffed Buffet (ICPC WF2014 B)

左のような状況になり得ないことを示す必要がある

Buffed Buffet (ICPC WF2014 B)

このとき計算すると青より緑がより最適になるので矛盾する

(スライドにしにくい)

よって

A[i][j]≦A[i][j+1]

s t u v

A[i][j]

j

今までの結果から、jとA[i][j]の関係はたとえば左図のようになる。

A[i][j]

j

真ん中の行の最適値を求めてから左上と右下に分けて分割統治

A[i][j]

j

真ん中の最適値を求めてから左上と右下に分けて分割統治

灰色のところはもう計算しない

計算量

分割統治で細かい断片に分かれるが、

・k回分割した後の断片たちの計算が合計でO(N)・O(log N)回分割される

計O(N log N)で全体が更新できる

(この問題ならN回W個のものを更新するので

合計O(NW log W)になる)

Wombats (IOI 2013)

・(r0,i)→(r1,k), (r1,k)→(r2,j)の最短経路長がそれぞれ分かっているので合成して(r0,i)→(r2,j) の最短経路長全部をO(N2)で求める必要がある

・下から上に逆走できないのでこのアイデアが出る

http://www.ioi-jp.org/ioi/2013/7-11/zoo6.jpg

http://www.ioi-jp.org/ioi/2013/7-11/zoo5.jpg

Wombats (IOI 2013)今、上の始点を固定したr0

r1

r2

https://pbs.twimg.com/profile_images/462152269824139264/uvdKueHz.png

Wombats (IOI 2013)□に行く最善の方法で△を通るとき

r0

r1

r2

http://www.ioi-jp.org/ioi/2013/7-13/brisbane7.jpg

Wombats (IOI 2013)□を左にずらしたら△が右に移動したほうが小さくなるケースはあるか?

交差しているところをもうちょっと真面目に考える

r0

r1

r2

Wombats (IOI 2013)最低1箇所はクロスすることになる(共有部分は点だけかもしれないけど)赤い辺に着目すると緑の経路のほうがオレンジの経路よりコストが低い

Wombats (IOI 2013)青い辺に着目するとオレンジの経路のほうが緑の経路よりコストが低い

これはおかしいhttp://www.ioi-jp.org/ioi/2013/7-12/awarding5.jpg

Wombats (IOI 2013)下の点を固定しても同じことが言える

ということでA[i-1][j]≦A[i][j]≦A[i][j+1]ふたたび登場Sashimiと同様、i-jの昇順にテーブルを埋めていく

r0

r1

r2

注意

この問題ではTelephone Wireのような簡単な更新は不可能

なぜか?→≧≧≧≦≦≦≦≦の形になっていない

100 1001001

0 0 0

000

0 0 0 0

0 0 0

□から○までの最短経路を求めるときに1→100と悪くなったのでやめる↓0の経路がその後にあることを見逃す↓メダルが消える

練習問題

AOJ 2603 Time TableAOJ 2488 Tree Constructionさっきの2つのURLの先にもたくさん練習問題があります。

Conclusion

・DPで「最適を出すkの値が単調」みたいな場面に出くわしたら計算量が改善できることもしばしばある

・どういうパターンかはしっかり考察する必要がある

・あと(DPテーブルを変な順で埋めるだけあって)実装が一筋縄ではいかないので要練習