演算法分析與設計實驗 二 之動態規劃

2021-09-14 05:27:58 字數 2288 閱讀 3849

(1)能用程式語言實現求解相關問題的演算法;

(2)深刻掌握動態規劃法的設計思想並能熟練運用;

(3)理解這樣乙個觀點:同樣的問題可以用不同的方法解決,乙個好的演算法是反覆努力和重新修正的結果。

(1)用動態規劃法求解問題;

(2)分析演算法的時間效能,設計實驗程式驗證分析結論。

(1)理解最優子結構的問題。

有一類問題的活動過程可以分成若干個階段,而且在任一階段後的行為依賴於該階段的狀態,與該階段之前的過程如何達到這種狀態的方式無關。這類問題的解決是多階段的決策過程。在50年代,貝爾曼(richard bellman)等人提出了解決這類問題的「最優化原理」,從而建立了最優化問題的一種新的演算法設計方法-動態規劃。

對於乙個多階段過程問題,是否可以分段實現最優決策,依賴於該問題是否有最優子結構性質,能否採用動態規劃的方法,還要看該問題的子問題是否具有重疊性質。

最優子結構性質:原問題的最優解包含了其子問題的最優解。

子問題重疊性質:每次產生的子問題並不總是新問題,有些子問題被反覆計算多次。問題的最優子結構性質和子問題重疊性質是採用動態規劃演算法的兩個基本要素。

(2)理解分段決策bellman方程。

每一點最優都是上一點最優加上這段長度。即當前最優只與上一步有關。

us 初始值,uj第j段的最優值。

(3)一般方法

1)找出最優解的性質,並刻畫其結構特徵;

2)遞迴地定義最優值(寫出動態規劃方程);

3)以自底向上的方式計算出最優值;

4)根據計算最優值時得到的資訊,構造乙個最優解。

步驟1-3是動態規劃演算法的基本步驟。在只需要求出最優值的情形,步驟4可以省略,步驟3中記錄的資訊也較少;若需要求出問題的乙個最優解,則必須執行步驟4,步驟3中記錄的資訊必須足夠多以便構造最優解。

(1)仔細閱讀備選實驗的題目,選擇乙個(可選多個)作為此次實驗題目,設計的程式要滿足正確性,**中有關鍵的注釋,書寫格式清晰,簡潔易懂,效率較高,設計的程式通用性好,適合各種合理輸入,並能對不合理輸入做出正確的提示。

(2)採用動態規劃的思想完成以下任務:

i.最大k乘積問題

問題描述

設i是乙個n位十進位制整數。如果將i劃分為k段,則可得到k個整數。這k個整數的乘積稱為i的乙個k乘積。試設計乙個演算法,對於給定的i和k,求出i的最大k乘積。

例如十進位制整數 1234 劃分為 3 段可有如下情形:

1 × 2 × 34 = 68

1 × 23 × 4 = 92

12 × 3 × 4 = 144

程式設計任務

對於給定的i 和k,程式設計計算i 的最大k 乘積。

資料輸入

輸入的第1 行中有2個正整數n和k。正整數n是序列的長度;正整數k是分割的段數。接下來的一行中是乙個n位十進位制整數。(n<=10)

結果輸出

計算出的最大k乘積。

輸入檔案示例

input.txt

3 2

312

輸出檔案示例

output.txt

62
實現提示

參考矩陣連乘問題。

**思路:

區間dp

設w(h,k) 表示: 從第h位到第k位所組成的十進位制數

設dp(i,j)表示前i位(1-i)分成j段所得的最大乘積,

a陣列儲存給定的n個數字 ;

則可得到如下經典的dp方程:

如果只分成一段,那麼m[i][1]=w[1][i];

否則:前i位(1:i)數字分j組乘積的最大值等於分為j-1組的結果再乘以乙個因子

tips:預處理連續數字乘積和存放在m陣列,dp[i][j]代表前i位有j個乘號。

dp[i][j]=max(dp[i][j],dp[k][j-1]*m[k+1][i]); 1<=kusing namespace std;

int main()

fclose(stdin);

freopen("output.txt","w",stdout);

for(int i=1;i<=n;i++) num[i][i]=a[i];

for(int i=1;i<=n;i++)

}

for(int i=1;i<=n;i++)

} fclose(stdin);

for(int k=2;ktemp)dp[i][j]=temp;

}} }

freopen("output.txt","w",stdout);

cout

return 0;

}

演算法設計與分析之動態規劃

include void main system pause 用陣列實現斐波那契函式 include include intmain int i 0 for i 2 i 20 i for i 0 i 20 i system pause return0 遞迴實現斐波那契函式 include intfi...

演算法設計與分析 (二)動態規劃

動態規劃的一般步驟 以揹包問題為例 動態規劃本質上為帶備忘錄的窮舉演算法。對動態規劃問題,直接套框架即可 問題有什麼 狀態 有什麼 選擇 然後窮舉。動態規劃演算法適用於組合優化問題,通過劃分子問題的邊界,從子問題開始逐層向上求解,通過子問題之間的依賴關係進行推導計算,最大限度減少重複工作,提高演算法...

演算法設計與分析 動態規劃

最大子段和問題 給定由n個整數 包含負整數 組成的序列a1,a2,an,求該序列子段和的最大值。i.當所有整數均為負值時定義其最大子段和為0。所求的最優值為 i.例如,當 a1,a2,a7,a8 1,3,7,8,4,12,10,6 時,最大子段和為 bj是1到j位置的最大子段和 由bj的定義易知,當...