Divide and Conquer
fenzhang August 12, 2011
想法:基本上,就是你想解決一個大問題,可是它又大又硬又難,
聰明的你就把它切開 or 劈開 or 掰開,讓它變小變軟變簡單。
步驟:切割 →遞迴(或某種順序)解決子問題 → 合併
1 普通例子
1.1 費氏數列
分割 FN → 遞迴得到 FN−1 和FN−2 →合併 FN−1 +FN−2
1.2 乘階
分割 N! → 遞迴得到 (N −1)! →合併 N ×(N −1)!
1.3 組合數
分割 Cmn → 遞迴得到 Cmn−1、Cmn−−11 →合併 Cmn−1 + Cmn−−11
1.4 連橫
分割一堆國家 → 各個征服 →統一
1
1.5 其他
merge sort,quick sort,and so on.
2 題目
<約瑟夫問題> TIOJ 1004
N 人圍成一圈每數 M 個人就誅了他,求最後活下來的人是幾號 優化:% 運算有點慢,如何能在 N 很大的時後減少 % 使用次數?
<河內塔> TIOJ 1355
有 3 根柱子,一開始有 N 個大小不同的盤子疊在其中一根,請問 要如何以最少步將盤子全部搬到另一根柱子上?
限制:過程中大盤子不可以放在小盤子上。
<快速冪>
給你 a、b、c,請在 O(logb) 時間內算出 ab (mod c) 應用:矩陣乘法、質數判定
<平面上最近點對> TIOJ 1500
給你平面上 N 個點,求出直線距離最近的點對。
複雜度 O(N logN logN) → O(N logN)
相關題:TIOJ 1108,1154,1199,1203,1356,1360,1455,1631,1677,1708
3 補充
樹分治:求出樹的重心,以重心為切割點遞迴。
< TIOJ 1696 ABCLS Contest Problem F 橘子園保衛戰>
給你一棵樹,邊權都是 1,每個點都有值 ki,對每個點求出距離 ki 以內的點數
2