• Tidak ada hasil yang ditemukan

skg August 23rd,2012 I.遞迴

N/A
N/A
Protected

Academic year: 2023

Membagikan "skg August 23rd,2012 I.遞迴"

Copied!
5
0
0

Teks penuh

(1)

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 <遞迴定義>

(2)

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)解。至於移動過程,也是利用相 同的切割和遞迴技巧,請學弟自行思考。

(3)

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個點的平面座標,求任兩點最近的距離是多少

(4)

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 個要吃晚餐的人和一個廚師。當然那些人可以同時一起吃,但廚師一次只能做一道菜。

給定每個人要吃的菜需要做多久,以及那個人需要吃多久,試問至少要多少時間,才能讓全部 人都吃完?

(5)

<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 最大可為 多少?

Referensi

Dokumen terkait

102 一、家長的數學能力信念 您認為家中的幼兒以後在學習下列數學能力時,怎麼做會比較好?每題有三個選項,請根據您的想法, 填答適合的數字 1 至 3,在最符合的答案前請寫 1 ,次符合的答案前請寫 2 ,最不符合的答案請寫 3 。請務必每個選項都要填上數字,且三個選項數字不重複,以利計分。 範例:如果想讓您的幼兒知道物體大小的概念,您覺得怎麼做會比較好?

94建中資訊科校內培訓 CK5826 馮俊菘 Dynamic Programming 方法概述 在Divide and Conquer的時候,如果一次會分成數個子問題,很容易就會要 重複計算一些子問題,這樣非常浪費時間。所以我們建一張表,把所有子問題的 答案存下來,下次再碰到時,就可以直接用。這是由上而下的做法。