skg
August 23
rd,2012 I.遞迴
遞迴是什麼?一般來說,當我們遇到問題的數值很小時,我們可以很輕易的解決他。而當 你發現對於一個問題,我們可以先將他切割成比較小的問題,再一直用重複的動作去處理,那 我們就可以選擇用遞迴。遞迴函式,就是在函式中呼叫自己,讓函式一層一層地反覆執行,一 但我們看出了遞迴的演算法,通常他就是最容易編寫的算法。但使用遞迴時要注意有些相同部 份會被不斷地反覆執行而造成浪費,或是遞迴過深造成stack overflow。
1.1 文字範例
今天是七夕情人節,出門會被閃瞎所以我選擇在家睡覺,不知不覺做了一個夢,我夢到今 天是七夕情人節,出門會被閃瞎所以我選擇在家睡覺,不知不覺做了一個夢...(ry
注意,如果沒有終止條件,遞迴會無止境的繼續下去,然後你就會得到一個RE(runtime error)
1.2 費氏數列
費氏數列是的相當知名的遞迴函數,其定義如下:
• Fib(0) = 0 <終止條件>
• Fib(1) = 1 <終止條件>
• Fib(n) = Fib(n-1) + Fib(n-2), n>1 <遞迴定義>
II. 分而治之 Fun and Jizz
分而治之(Divide and Conquer,簡稱D&C)顧名思義,就是把問題分解,再一一解決。也就 是當你看到一個問題又大又硬又難,就把它切開or 劈開or 掰開,讓它變小變軟變簡單。最常 用的分法是二分,每次都把問題切成兩半直到我們能回答。但有些時候一直把問題切成一半並 不能解決問題,可能還需要分塊處理。
2.1 快速冪運算
冪運算就是計算像an這種式子,最直觀的想法是把a乘上n次,這樣的時間複雜度是
O(n),還可以再更好。因為乘法的結合率,我們發現如果n是偶數,那麼an會等於an/2 x an/2,
例如210,我們可以把它分成兩個25,然後繼續分下去,時間複雜度降到O(lgn)。
ProcedurePower(a,b) 1 if b == 1
2 returna
3 t = Power(a,b/2) 4 if b mod 2 == 0 5 returnt * t 6 else
7 returna * t * t
2.2 河內塔
河內塔是從一個傳說形成的問題:有三根柱子和N個圓盤,剛開始每個圓盤由大到小疊在 第一根柱子上,我們要將所有圓盤移動到第三根柱子並且1.每次只能移動一個圓盤;2.大盤子 不能疊在小盤子上面。請求出移動過程和最少要移動幾次?
當N不小時,初學者看到這題往往覺得會太複雜、不太可能有解。這時就要用到Divide
and Conquer來簡化問題:當N=1時,顯然只要一步就可以做到;當N=2時,我們只要先把第
一個圓盤移到第二根柱子,再把第二個圓盤移到第三根柱子,最後將第一個圓盤也移過去。有 沒有發現?當我們要移動N個圓盤時,一定要先把前N-1個圓盤移到第二根柱子,再將最大的 圓盤移到第三根柱子,最後再把前N-1個圓盤移過去。如此一來,我們便成功地分割了問題,
也得到了遞迴式f(n)=2f(n)+1,還可以透過解遞迴來得到O(1)解。至於移動過程,也是利用相 同的切割和遞迴技巧,請學弟自行思考。
III.例題練習
<TIOJ1355,1356,1357>河內之塔-蘿莉塔,便當塔,金色巨塔 河內塔問題,請輸出它的:
1.移動過程(n<10)
2.一號三號柱子之間移動必須先經過二號的最少步數移動過程(n<10) 3.四根柱子時的最少步數(n<50)
<TIOJ1199>神奇的模術
給定n, y, xn mod y,求有幾組介於0~y-1之間的整數解x (0<=n<231, 0<y<=40000)
<TIOJ1127>鋪瓷磚問題
有一塊寬3單位、長n單位,但左上角缺1平方單位的土地,現在要用(3n-1)/2塊寬1單位、
長2單位的瓷磚把土地鋪滿,請問有多少鋪法(3<=n<=41)
<TIOJ1108>樹的三兄弟
給你一顆二元樹的前序表示法和中序表示法,求後序表示法(字串長度<50
<TIOJ1202>重疊的天際線
給你n棟建築的左界L,高度H,右界R,求出他們的天際線(1<=n<=30000)
<TIOJ1500>Clean up on aisle 3
給定n個點的平面座標,求任兩點最近的距離是多少
skg
August 23
rd,2012 I. Greedy Method ( 貪婪法 )
Greedy Method(貪婪法)顧名思義就是貪心!!在每次要做選擇的時候,都選在當前狀態 下最好的選擇。但並不是所有問題都能這麼輕易就解決,因此最好還要能夠證明正確性。
Greedy = 觀察 + 假設 + 證明
當然Greedy的問題不一定都這麼單純,有時還會配上其他演算法或資料結構甚至是數學,
讓Greedy不容易被想到,接著就直接來做些練習吧!!
II. 例題練習
<TIOJ1434>工作排程
小光一天收到了M張訂單資料,告訴你處理每張訂單需要花費的時間E和那張訂單的截止時
間D,求是否能處理完所有訂單並不超過截止時間。1 ≤ M ≤ 1000, 1 ≤ E ≤ D ≤ 10000
Fractional Backpack 分數背包
給定背包的容量W和N件物品,每一件物品都有自己的體積和價值,物品可以切割而且切割 後的價值和體積成正比,求背包最多能裝下多少價值的東西?
<TIOJ1066>NPSC2005 pB惱人的零錢
東東想要買一個價格C的物品,告訴你東東和老闆各別擁有的一元、五元、十元、二十元、
五十元硬幣的數量,東東想要盡量減少他身上的硬幣數量但一定要讓老闆有得找,請輸出他身 上最少能剩下多少硬幣?
<TIOJ1072> NPSC2005 pA 誰先晚餐
給你n 個要吃晚餐的人和一個廚師。當然那些人可以同時一起吃,但廚師一次只能做一道菜。
給定每個人要吃的菜需要做多久,以及那個人需要吃多久,試問至少要多少時間,才能讓全部 人都吃完?
<TIOJ1401>功夫城堡
在一個N*N 的棋盤上放置N 個給定範圍的城堡,是否能使得他們不會互相攻擊?
1<=N<=100,000
<TIOJ1231>寵物雞問題
一隻電子寵物雞每分鐘可以吃一份飼料,一單位熱量能讓寵物雞多一公斤,而一分鐘沒吃東西 就會少一公斤,現在給你N種食物的熱量和保存期限(過了保存期限就不能再餵寵物雞吃那種 飼料),問在限定時間內最多能讓寵物雞增加多少公斤?
<TIOJ1221>炒菜問題(POI XII Toy Cars)
有n種料理和k的炒菜鍋,如果炒菜鍋是乾淨的或要炒跟上一道一樣的料理就不用洗鍋子,現 在給你客人們的點餐順序,求最少要洗幾次鍋子?(1<=k<=n<=100,000;1<=p<=500,000)
<TIOJ1432,1465>骨牌遊戲,H遊戲秘笈
給定一個由N個數字組成的序列,求使分成K段之後每段總合的最大值最小的分法。
<TIOJ1406> FISH
有一條大馬路,馬路上有N個城鎮,每個城鎮都有一些魚。現在我們要運送這些魚使每個城 鎮的都有大於等於Y噸的魚。然而每運送一公里就會被搶走一噸的魚。想請問你K 最大可為 多少?