Upload
tozan-gezan
View
280
Download
0
Embed Size (px)
Citation preview
これらの手法の個人的イメージ
・典型テクではある
・とはいえ使いどころが非自明
・中でやってることも単純じゃないことが多い
・なかなかこういう問題は作られない
・経験が積みにくい
練習しにくい二分探索的ポジション
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]を計算
・以下繰り返し
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]が成り立つというものが有名
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]が成り立つかどうか
計算量
分割統治で細かい断片に分かれるが、
・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)青い辺に着目するとオレンジの経路のほうが緑の経路よりコストが低い
これはおかしい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の経路がその後にあることを見逃す↓メダルが消える