CK6125 姜俊宇
MIN-HEAPIFY (x) 1 l ← x × 2 2 r ← x × 2 + 1
3 if l ≤ n and Heap[l].key < Heap[x].key 4 then min ← l
5 else min ← x
6 if r ≤ n and Heap[r].key < Heap[min].key 7 then min ← r
8 if min ≠ x
9 then exchange Heap[x] ↔ Heap[min]
10 MIN-HEAPIFY(min)
HEAP-UP (x)
1 while x > 1 and Heap[x]<Heap[PARENT(x)]
2 do exchange Heap[x] ↔ Heap[PARENT(x)]) 3 x ← Parent(x)
INSERT (v) 1 n ← n + 1 2 Heap[n] ← v 3 HEAP-UP (n) DELETE (x)
1 exchange Heap[x] ↔ Heap[n]
2 n ← n – 1
3 if x > 1 and Heap[x] < PARENT(x) 4 then HEAP-UP (x)
5 else MIN-HEAPIFY (x) FIND-MIN ()
1 return Heap[1]
堆積結構 Heap
Heap是一種頗常見且好用的資料結構之一,可以迅速插入刪除元素,並在O(1)的時間內找到極值。
Heap的性質
1. Heap是一棵完全二元樹(Complete Binary Tree)或是空樹
2. 每個節點必定小(大)於其子節點每個節點必定是以其為根的子樹中最小(大)的一個點。
Heap的實現
由於Heap是一棵完全二元樹,所以可以用一般的陣列(Array)實現。
令整棵Heap的root為heap[1],則節點heap[x]的左子節點為 heap[2x],右子節點為heap[2x+1]
Heap的操作(以下皆以Min-Heap為例) 最小堆化Min-Heapify(x) – O(lgn)
當heap[x]的兩個子樹heap特性時,將以heap[x]為根的整個子樹heap化。
上移元素Heap-Up(x) – O(lgn)
當heap[x]可能小於父節點時,將heap[x]作更動以保持heap特性。
插入元素Insert(x) – O(lgn)
將一個元素v插入heap中並保持heap特性。
刪除元素Delete(x) – O(lgn)
將位於heap[x]的元素從heap中刪除,並保持heap特性。
想一想
ACM 10954 Add All
給定一堆數字,取出兩個數字加起來之後丟回去,重複動作直到只剩一個數字,問該數字最小多少。
ACM 978 Lemming Battle!!
給定戰場數、兩軍的兵數以各自的戰鬥力,每一輪各推派戰鬥力最強幾位的去各個戰場戰鬥,若一 方人數不足則戰場留空。若雙方戰鬥力相同則同歸於盡,否則戰鬥力強者存活且戰鬥力會變弱,變弱的 程度相當於對方之戰鬥力,存活者回到陣營中,再選人進行下一輪,戰到至少有一方全滅為止,問是雙 方皆全滅或是藍、綠哪一方獲勝及獲勝方剩餘的戰鬥力,以非遞增方式輸出。
挑戰題 TIOJ 1402 淹水問題
在M*N的土地上,降下了相當多的雨水。水會往低處流,也會在低處積水。 一旦水越過了邊界,就會 流到外面去。請問這樣的地形最多能夠累積多少單位的水量呢?
類題
ACM 501,757,10787…. TIOJ 1128,1155,1161,1202,1221,1223,1304,1397-1403….
動態規劃法 Dynamic Programming(DP)
如同Divide & Conquer,DP將問題分割成數個子問題分別 的過程中會記錄子問題的答案,並不
DP的性質
(1) 子問題重疊性:當問題被分割時
(2) 最優子結構性:問題的最佳解包含了子問題的最佳解
DP問題限制
(1) 最優化限制:暫不管先前的策略與解答 (2) 無後顧限制:目前的最佳狀態決定後 DP 方法的步驟
(1) 分析問題,找出問題與子問題的關連性
(2) 找出DP的關係式(遞迴式、
(3) 利用Bottom-Up或Top-Down
(4) 根據上步驟所得到的答案找出最佳解
DP 的缺點 若相同子問題出現頻率過低時相當不適用
DP 的題型
『題1』費氏數列
F(n)=F(n-1)+F(n-2),F(1)=1,F(2)=1
『題2』生產線
現在有兩條生產線,每條線有n 要依序經過n個工作站(無論在哪條線上 從W1,x到W2,x+1需要T1,x的時間 生產線送出分別需要E1、E2、X1、
給定這些時間,若想以最快的方式生產一件產品
『題3』最大連續元素和
給定一個序列,問連續元素的和最大可為多少
『題4』Tri Tilling(Uva 10918)
問有多少方法可以用1x2的積木填滿
『題5』零錢問題(Uva 674)
某城市使用n種貨幣,面額分別是
『題6』零錢問題II(Uva357)
某城市使用n種貨幣,面額分別是
『題7』最大正方形(TIOJ1097 營地
有一塊m×n大小的土地,每一格標示
現在要蓋正方形房子,試問房子的邊長最大值為何
Dynamic Programming(DP)
將問題分割成數個子問題分別解決,但與D&C 並不重複計算相同的子問題。
當問題被分割時,分割後的子問題常常是『老問題』
問題的最佳解包含了子問題的最佳解
暫不管先前的策略與解答,目前所知所有的子問題解答可以構成問題的最佳解 目前的最佳狀態決定後,不會影響到之前所決定的最佳性
找出問題與子問題的關連性
、狀態轉移方程)
Down的方式計算最佳值(若題目要求最佳過程 根據上步驟所得到的答案找出最佳解。
若相同子問題出現頻率過低時相當不適用。
2),F(1)=1,F(2)=1,求F(n)?
n個工作站,第a條線上的第b個站需要Aa,b 無論在哪條線上),才能出廠。從工作站W1,x到W1,x+1
的時間;同樣的,從W2,x到W1,x+1需要T2,x
、X2的時間。
若想以最快的方式生產一件產品,要經過哪些工作站?
問連續元素的和最大可為多少?
的積木填滿3xn的格子?
面額分別是d1,d2,...,dn。請問湊出k元所需的最小貨幣數量為何
面額分別是d1,d2,...,dn。請問湊出k元的方法數有多少
營地)
每一格標示0的位置代表不能蓋房子,標示1的位置代表可以蓋房子 試問房子的邊長最大值為何。
CK6125 姜俊宇
D&C不同的是,DP在計算
目前所知所有的子問題解答可以構成問題的最佳解。
不會影響到之前所決定的最佳性
若題目要求最佳過程,則需一邊記錄)
Aa,b的時間。每一個貨物都
W1,x+1不需要花時間,但是
T2,x的時間。進入生產線和從
元所需的最小貨幣數量為何?
元的方法數有多少?
的位置代表可以蓋房子,
CK6125 姜俊宇
『題8』Little Red Riding Hood(Uva 11067)
給定一地圖的起點終點,只能往上跟往右走,路上有許多障礙物,問有幾種走法。
『題9』最長遞增子序列(LIS,Longest Increasing Subsequence)(Uva 481)
給定一個數列,請刪掉最少量的數字使得剩下的序列是嚴格遞增的(稱為LIS)。
『題10』最長共同子序列(LCS,Longest Common Subsequence)(Uva 10405)
給定兩個字串,請在分別刪除兩個字串中的某些字母,使得剩下的子字串完全相同,且子字串長度 最長。例如algorithm和alcoholism的LCS是aloim。
『題11』0-1背包問題(Knapsack Problem)
一個負重量為K的背包,以及N件物品,其重量及價值分別為Wi以及Ci。現在請你挑一些物品放進背 包(每件物品皆不可分割),但是這些東西的總重量不能超過K。試求放進背包物品總價值的最大值Cma
小問題:如果每件物品可以放無限個呢?_____________________________________________________
如果物品經過分組,每組最多選一件呢?_____________________________________________________
『題12』燈泡問題(95年建中校內賽考題)(TIOJ1007)
我們有一些不同的燈泡,裡面都有一條燈絲,但品質都不是很好,如果持續地讓燈泡亮著的話,燈 絲過一會兒就燒斷了,因此必須有時將電源切斷,讓燈絲降溫。
假設一個燈泡最多可以持續點亮 n單位的時間而不燒斷,而總時間是 m單位時間。請寫一個程式,
給定n和m的值,算出有幾種不同的明暗排列方式,每一種排列方式之中都不會出現亮超過連續 n單 位時間的區段。
『題13』A game(96年建中校內賽考題)(TIOJ1029)
「A遊戲」是個由兩個人玩的遊戲:有一串由N個正整數所組成的數列,兩個玩者輪流拿走一個最 左邊或最右邊的數,直到最後所有的數都取完之後,兩個玩者分別把自己所取到數加總,分數較高的人 獲勝。 今假設兩個玩者都是最佳玩家──也就是說,兩者都不會犯錯,會就目前狀況盡自己的力取得盡 量多的分數──試求兩個玩家所能得到的最高分數各為多少?
『題14』製造回文Palindrome(Uva 10944)
現在給你一個字串,請問最少插入幾個字可以使其變成一個回文
『題15』投擲骰子Dice Throwing(Uva 10759)
投擲 n 個一般的骰子(每個骰子有6面,分別有點數1到6點),點數總和至少 x 的機率是多少?
(1 <= n <= 24)和 x(0 <= x < 150)
『題16』加拿大旅行Canada Tour(USACO Chap5.4)
平面上有若干個城市,由西向東依次為c1, c2,…, cn。但並不是每個城市之間都有航線相通,只有某些城 市有飛機班次,這些相通的城市對是給定的。
現在希望從c1出發,一路經過的城市只能向東,到達某個城市後轉向,再一路向西經過若干個城市回
到c1,且這些城市都不能重複。問最多能經過幾個城市?
CK6125 姜俊宇
『題17』郵局設置問題EX(TIOJ1449)
在一條線上取n個點,每個點距離不同,問取k個點時,所有點離最近的選取點的距離和為多少?
『題18』矩陣相乘問題
給定一連串可以依序相乘的n個矩陣,請你找出一種相乘方式使得所需的總乘法數最少。
『題19』最佳搜尋二元樹Optimal Binary Search Tree
對於同一組數值資料,所形成的二元搜尋樹可能有很多種。現在給你每個數被查詢的次數,試找出 其中一種二元搜尋樹,使得所有數字被查詢時的總比較次數最少。
『題20』糊塗情報員(95年全國賽)(TIOJ1145)
給定一個算式,要求求出加了若干刮號後的最大值。
『題21』樹根The Tree(Uva10459)
給定一棵樹,問選定哪些節點當根,樹的高度會最高或最低。
『題22』煉金術(Uva10459)
在這個世界的規則是這樣的:
#1有種東西叫做價值,有形也好無形也好,價值就只是個價值,越高越好。
#2任兩物質融合後,一定會有一個物質被取代,而不會產生第三種物質。
在你眼前有著n樣物質,以及兩張紙張,上面各有一個n*n 的表格,分別是:
#1當兩個物質融合後所獲得的價值是多少
#2當兩個物質融合後會是哪個物質留下(另個物質會被取代掉) 身為一個稱職的鍊金術師,你要怎樣融合使獲得的價值會最高呢?!
『題23』松鼠吃松果nuts for nuts….(Uva 10944)
格子上有n個松果,其中n<=15。
試問:從原點出發,最少要走多少距離才能吃到所有松果再走回原點?
『題24』分隊問題Forming Quiz teams(Uva 10911)
你被指派一個任務要組隊參加一個猜謎比賽(MCA CPCI Quiz Championship)。有 2*N 個學生有興 趣參加,而你要把他們組成 N 隊,每隊2個人。由於隊友間需要在一起練習,學生們都希望隊友的家 盡可能離自己的家近一些。令 x1 代表第1隊隊員家之間的距離,x2 代表第2隊隊員家之間的距離,
依此類推。你必須要確保 x1+x2+x3+...+xn 為最小。
類題
ACM 711,10081,10482,10549,10558,10201,10154,10259,10261,10280,10379,10529,10559,10593,10599, 10604,10617,10635,10645,10690,10721,10723,10739,10755,10759,10817,10819,10827,10860,10874,10913 TIOJ 1014,1019,1043,1051,1096,1100,1118,1127,1134,1141,1126,1261,1301,1316,1357,1384-1391,1393-1395, 1410,1411,1432,1444,1447