習題8.1
6.切割木棍問題為下列問題設計乙個動態規劃演算法。已知小木棍的銷售**pi和長度i相關,i=1,2,…,n,如何把長度為n的木棍切割為若干根長度為整數的小木棍,使得所獲得的總銷售**最大?該演算法的時間效率和空間效率各是多少?
解答:令長度為n的木棍能獲得的最大**為profit[n],遞推公式為:profit[n] = max(pi[i] + profit[length - seg[i]]), 其中i = 1,2,3,...n;邊界條件profit[0]=0。
#include using namespace std; //自底向上,兩個迴圈,不用遞迴;
int main()
;
int *r = new int[n + 1];
for (int i = 0; i <= n; ++i)
r[i] = 0; //初始化
for (int i = 1; i <= n; ++i)//規模長度為i
r[i] = q; //找出i這個位置的最優解;
} cout << r[n]; //最後是n這個位置,就是n公尺長的木頭的最大價值。
delete r;
return 0;
}
此演算法的時間效率是o(n^2),空間效率是o (n)
7.最短路徑數量西洋棋中的車可以水平或豎直移到棋盤中同行或同列的任何一格。將車從棋盤的一角移到另一對角,有多少條最短路徑?路徑的長度由車所經過的方格數(包括第一格和最後一格)來度量。使用下列方法求解該問題。
a.動態規劃演算法
解答:西洋棋的棋盤為8*8,假設從左下角移動到右上角,p(i,j)表示從起始位置移動到第i行第j列的最短路徑數,遞推公式為
計算結果如下圖所示:
b.基本排列組合
解答:對於n*n的棋盤,從(1,1)移動到(n,n)的最短路徑總數應該為c(2(n-1), n-1), 因為必走2(n-1)步,其中n-1步向左,剩下為向右。c(14,7)=3432
11.最大子方陣對乙個m×n布林矩陣b,找出其元素均為0的最大子方陣。設計乙個動態規劃演算法並給出時間效率。(該演算法可能會用於在計算機螢幕中尋找最大空白區域或者是選擇建築地點。)
解答:對每個元素,把以其為右下角,元素全為0的正方形的最長邊長記錄下來。如果以元素b(i, j)為右下角的正方形邊長為b,那麼以b(i-1, j)為右下角的正方形邊長肯定為b-1,且以b(i, j-1)為右下角的正方形邊長為b-1,否則正方形的邊不完整。
public int maximalsquare(char a)
} }
return result*result;
}
習題8.2
5.假設n種物品中每種物品的數量不限,為該揹包問題設計乙個動態規劃演算法並分析該演算法的時間效率。
解答:完全揹包問題與01揹包問題的區別在於每一件物品的數量都有無限個,而01揹包每件物品數量只有乙個。問題解法其實和01揹包問題一樣,只是初始化的值和遞推公式需要稍微變化一下。初始化時,當只考慮一件物品a時,f[1][j] = j/weight[a]。遞推公式計算時,f[i][j] = max,注意這裡當考慮放入乙個物品 i 時應當考慮還可能繼續放入 i,因此這裡是f[i][j-weight[i]]+value[i], 而不是f[i-1][y-weight[i]]+value[i]。演算法的時間效率θ(nw)
習題8.3
11.矩陣相乘考慮如何使得在計算n個矩陣的乘積
a.給出乙個三個矩陣連乘的例子,當分別用
解答:矩陣維數a1為1000*1,a2為1*1000,a3為1000*1
b.有多少種不同的演算法來計算n個矩陣的連乘乘積?
解答:演算法數遞推公式為
並且m(1)=1.
c.設計乙個求n個矩陣乘法最優次數的動態規劃演算法。
解答:設矩陣連乘積aiai+1…aj簡記為a[i:j],設計算a[i:j],1≤i≤j≤n,所需要的最少數乘次數m[i,j],則原問題的最優值為m[1,n]。當i=j時,a[i:j]=ai,因此,m[i][i]=0,i=1,2,…,n。當i綜上,有遞推關係如下:
習題8.4
11.挑棍遊戲也叫「挑遊戲棒」或「撒棒」。該遊戲有若干塑料或木製的遊戲棒散倒在桌子上,玩家要試著把他們一根接一根取走而不要移動其他遊戲棒。在這裡,我們只考慮一對對遊戲棒之間是不是通過一系列相互搭著的遊戲棒相連線。給定n(n>1)根遊戲棒(假設它們散倒在一張很大的畫圖紙上)的端點列表,請找出左右相連的遊戲棒。請注意,搭在一起的算相連,但能通過其他相連遊戲棒間相連的也應該算相連。
解答:該任務初看跟warshall演算法沒有聯絡,但仔細分析後發現,只要將遊戲棒縮小成乙個點,如果兩根遊戲棒的端點值一樣,則可以看成這兩個點之間有邊相連;這樣散倒在桌子上的遊戲棒就變成了乙個無向圖,找出所有相連遊戲棒的任務就變成了求出該無向圖的傳遞閉包。
第八章 高效演算法設計
分治法求最大連續和 注意範圍是 x,y includeusing namespace std int maxsum int a,int x,int y int main 3 1 0 1 2 int t 100 k 0 printf d n quicksort a,0,4 return 0 二分查詢折...
第八章 指標 第八章 指標
1 什麼是位址 include using namespace std int main 11 在堆中建立對像 我們既然可以在堆中儲存變數,那麼也就可以儲存對像,我們可以將對像儲存堆中,然後通過指標來訪問它 include using namespace std class human 14 在建構...
第八章 設計原則
模擬是避免做傻事的最佳方式。到目前為止我們一直致力於應用程式編碼之前的事情上,如收集需求 分析 編寫功能列表 繪製用例圖等。當然,在某些地方真的必須編寫一些 那是設計原則真正開始產生作用的地方。設計原則 是能被應用到設計或編寫程式 中的工具或技術,讓程式 更可維護 根具靈活性或者更易擴充套件。oo原...