算法設計與分析 動態規劃 習題

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) 分析算法的時間複雜度。

  • 解法:從底向上遞推,f(i)(j)=MAX[f(i1)(j),f(i1)(j+1)]f(i)(j)=MAX[f(i-1)(j), f(i-1)(j+1)]
  • 複雜度O(n)O(n)
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 的子方陣使其階數達到最大值。

要求寫出僞代碼、遞歸方程並分析算法的時間複雜度。

  • 解法:f(i)(j)f(i)(j)表示以第iijj列的格子爲矩陣右下角的階數最大值
  • f(i)(j)=MIN(f(i1)(j1),k)+1f(i)(j)=MIN(f(i-1)(j-1), k)+1
  • 滿足a[i][jh]=a[ih][j],h=0,1,2,...,ka[i][j-h]=a[i-h][j], h=0,1,2,...,kkk最大

3.4

石子歸併問題:在一個圓形操場的四周擺放着n堆石子,現要將石子有次序地合併成一堆。規定每次只能選擇相鄰的兩堆石子合併成新的一堆,並將新一堆石子數記爲該次合併的得分。試設計一個動態規劃算法,計算出將n堆石子合併成一堆的最小得分和最大得分.

要求列出遞歸方程,寫出算法的僞代碼並分析算法的計算複雜性。

  • 解法:分別使用最大堆和最小堆,每次取出兩次堆頂元素,合併,計算代價,再放入堆中。

3.5

我們考慮將數軸上的n個點聚成k類的問題。
輸入:n個從小到大的不同實數x1, x2, …, xn表示n個不同點,一個參數kn.
任務:將n個點劃分成k個不相交的非空集合S1, …., Sk滿足⋃_(i=1)^k▒S_i ={x1, x2, …, xn},Si中所有點在Si+1中所有點左邊,1i<k,也就是說對於任意xSi, zSi+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)分析算法的時間複雜度。

  • 解法:f(i,j)f(i, j)爲從第1到第i本書分爲j份的最小最大值
  • 前提:因爲一堆書被分爲k-1份後,再分一份變成k份一定更優
  • f(i,j)=MIN[MAX[f(p,i1)+sum[j]sum[p]]],p=i,i+2,...j1,sum[i]=sigma(1,i)f(i, j)=MIN[MAX[f(p, i-1)+sum[j]-sum[p]]], p=i,i+2,...j-1, sum[i]=sigma(1,i)

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章