3.1
滿足遞歸式F(n)=F(n-1)+F(n-2)和初始值F(0)=F(1)=1的數列稱爲斐波那契數列。考慮如何計算該數列的第n項F(n)。
(1)說明根據遞歸式直接完成計算,將有子問題重複求解;
(2)說明該問題具有優化子結構;
(3)寫出求解F(n)的動態規劃算法,並分析算法的時間複雜性。
3.2
數字三角形問題:設有一個三角形的數塔,頂點爲根結點,每個結點有一個整數值。從頂點出發,可以向左走或向右走,如圖所示:
要求從根結點開始,請找出一條路徑,使路徑之和最大,只要輸出路徑的和。
要求:(1) 寫出遞推方程;(2)寫出算法僞代碼;(3) 分析算法的時間複雜度。
- 解法:從底向上遞推,
- 複雜度
for (int i=n-1;i>=1;i--){
for (int j=1;j<=i;j++){
f[i][j]=max(f[i-1][j], f[i-1][j+1]);
}
}
3.3
給定一個n×n的矩陣 A,矩陣中的元素只取 0 或者 1。設計一個動態規劃算法,求解得到 A 中元素全是 1 的子方陣使其階數達到最大值。
要求寫出僞代碼、遞歸方程並分析算法的時間複雜度。
- 解法:表示以第行列的格子爲矩陣右下角的階數最大值
- 滿足且最大
3.4
石子歸併問題:在一個圓形操場的四周擺放着n堆石子,現要將石子有次序地合併成一堆。規定每次只能選擇相鄰的兩堆石子合併成新的一堆,並將新一堆石子數記爲該次合併的得分。試設計一個動態規劃算法,計算出將n堆石子合併成一堆的最小得分和最大得分.
要求列出遞歸方程,寫出算法的僞代碼並分析算法的計算複雜性。
- 解法:分別使用最大堆和最小堆,每次取出兩次堆頂元素,合併,計算代價,再放入堆中。
3.5
我們考慮將數軸上的n個點聚成k類的問題。
輸入:n個從小到大的不同實數x1, x2, …, xn表示n個不同點,一個參數kn.
任務:將n個點劃分成k個不相交的非空集合S1, …., Sk滿足⋃_(i=1)^k▒S_i ={x1, x2, …, xn},Si中所有點在Si+1中所有點左邊,1i<k,也就是說對於任意xSi, zSi+1, y<z.
目標:最小化∑_(i=1)^k▒〖cost(S_i)〗,其中cost(Si)=(max(Si)-min(Si))2. max(Si)是Si中的最小元素,min(Si)是Si中的最大元素。
例如,如果Si={xj},cost(Si)=0,如果Si={xj, xj+1, …, xj+t}, xj,<xj+1< …< xj+t,那麼cost(Si)=(xj+t-xj)2.
- 思路:猜想代價單調且滿足貪心策略(未證明,不確定)
- 大概像下一題3.6一樣,代價計算策略不同
3.6
假設書架上一共有9本書,每本書各有一定的頁數,分配3個人來進行閱讀。爲了便於管理,分配時,各書要求保持連續,比如第1、2、3本書分配給第1人,4、5分配給第二人,6,7,8,9分配給第3人,但不能1,4,2分配給第1人,3,5,6分配給第2人。即用兩個隔板插入8個空隙中將9本書分成3部分,書不能換位。同時,分配時必須整本分配,同一本書不能拆成兩部分分給兩個人。爲了公平起見,需要將工作量最大的那一部分最小化,請設計一個動態規劃算法。用s1,…,sn表示各本書的頁數。
(1)簡明的寫出問題的遞推方程; (2)描述算法僞代碼; (3)分析算法的時間複雜度。
- 解法:爲從第1到第i本書分爲j份的最小最大值
- 前提:因爲一堆書被分爲k-1份後,再分一份變成k份一定更優
3.7
將一根木棒折成若干份,每折一次的代價是當前這段木棒的長度, 總代價是折這根木棒直到滿足要求所需要的所有操作的代價。例如,將一根長度爲10的木棒折成四段,長度分別爲2, 2, 3, 3,如果先折成長度爲2和8的兩段,再將長度爲8的折成長度爲2和6的兩段,最後將長度爲6的折成長度爲3的兩段,這些操作的代價是10+8+6=24;如果先折成長度爲4和6的兩段,在分別將長度爲4的折成長度爲2的兩段、長度爲6的折成長度爲3的兩段,則這些操作的代價是10+4+6=20,比上一種方案更好一些。該問題的輸入是木棒的長度L和一些整數c1,…,cn,.
要求將木棒折成長度爲c1, …, cn的n段且操作代價最小,請設計動態規劃算法解決該問題。
- 解法:逆向3.4