More Related Content
More from AtCoder Inc. (20)
最適二分探索木問題
- 2. 問題
⼊⼒
• 𝑛 個の重み 𝑤# (1 ≤ 𝑖 ≤ 𝑛) がある
出⼒
' 𝑤#×depth(𝑖)
#
• が最⼩な順序付き⼆分⽊を作れ
• ただし depth(𝑖) は左から i 個⽬の葉の深さ
• そのコストを求めよ
2016/4/10 2
- 5. これから学ぶこと
1. 𝑶 𝒏 𝟑
の解法
区間に関する基礎的な動的計画法
2. 𝑶 𝒏 𝟐
の解法
Monge 性の活⽤による動的計画法の⾼速化
3. 𝑶 𝒏 𝐥𝐨𝐠 𝒏 の解法
Hu-Tucker アルゴリズム + 併合可能順位キュー
2016/4/10 5
- 7. 解法 1
考える部分問題
• 区間 [𝑖, 𝑗] に対して,
• 要素 𝑖, 𝑖 + 1, … , 𝑗 で作る最適⼆分探索⽊を考える.
• このコストを 𝑐#A とおく.
漸化式
• 「⼀番上のノードでどう分割するか」を考える.
• [𝑤#, 𝑤#BC, … , 𝑤A] → [𝑤#, … , 𝑤E] [𝑤EBC, … ., 𝑤A]
分割の場所 𝑘 を全通り試すと漸化式になる.
𝑐#,A = min
#KELA
𝑐#,E + 𝑐EBC,A + ' 𝑤E
A
EM#
2016/4/10 7
- 10. 解法 2
鍵となる直感
例えば,部分問題 [𝑤P, 𝑤Q, … , 𝑤CR] で
5 と 6 の間で切るのが最適だと仮定する.
(つまり [𝑤P, … , 𝑤S] [𝑤T, … . , 𝑤CR] にするのが最適のとき)
↓
この時,部分問題 [𝑤P, 𝑤Q, … , 𝑤CR, 𝑤CC] で,
5 より左で切ることはまずないのでは?
区間は右側に⼀つ伸びた.バランスを取るはず.
切る場所は,右には移動するかもしれないが,
左に移動するとは思えない!
2016/4/10 10
- 13. 解法2
より⼀般的な話:Monge 性
区間に対する重み関数が QI (Quandrangle Inequality) かつ MLI (Monotone on
the Lattice Intervals) ならば,同様の効率的な動的計画法を適⽤できる.
重み関数を 𝑓 とする.
• 𝑓 が QI であるとは,共有点を持つ任意の 2 つの区間 𝑎, 𝑏 に関して,
以下を満たすこと.
𝑓 𝑎 ∪ 𝑏 + 𝑓 𝑎 ∩ 𝑏 ≥ 𝑓 𝑎 + 𝑓 𝑏
• 𝑓 が MLI であるとは,𝑎 ⊂ 𝑏 となる任意の 2 つの区間 𝑎, 𝑏 に関して,
以下を満たすこと.
𝑓 𝑎 ≤ 𝑓(𝑏)
例えば,最適⼆分探索⽊の場合は,f は以下の関数となっている.
𝑓(𝑎) = ∑#∈g 𝑤#
2016/4/10 13
- 17. 解法3
⽤語
• 葉 = 最初からある要素たち
• 中間ノード = マージで⽣成される要素
ハフマン⽊と違って,各要素には場所がある.
中間ノードの場所は適当にその辺に置いておく.
(例えば,含んでる⼀番左の葉の場所とかとして考えとけばOK)
2016/4/10 17
- 19. 解法3
例
• [1, 2, 23, 4, 3, 3, 5, 19]
• [3, 23, 4, 3, 3, 5, 19] 1,2 は隣り合ってるからマージOK
• [3, 23, 4, 6, 5, 19] 3,3 も隣り合ってるからマージOK
• [3, 23, 9, 6, 19] 4,5 は間に中間ノードしかないからマージOK
• [3, 23, 15, 19] 3,6 とかマージしたいけど,間に葉 23 があるのでNG
• [26, 15, 19]
• [26, 34]
• [60]
⿊が葉,⾚が中間ノード
http://www-math.mit.edu/~shor/PAM/hu-tucker_algorithm.html
例はここからお借りしました
2016/4/10 19