課程筆記矩陣連乘問題(動態規劃 遞迴 備忘錄優化)

2021-10-04 13:23:37 字數 2809 閱讀 4841

這道題感覺和dijkstra演算法有點類似,都是迴圈先確定乙個值後,再去找有沒有更優的解法去替換,不過這個題用來學動態規劃真的很好理解,要是當時能用這個題這個理解方法也許就繼續acm了…

此圖即為dp陣列的填充過程,首先完成左上到右下的斜對角線的賦0工作,因為矩陣自己乘沒有運算,dp[i][i]全部為0 。

整體的填充過程為按照對角線依次向右上方,r=2->n,最後乙個對角線n只需要填充乙個數值,dp[1][6]即為最後的答案。

在每乙個對角線中,i都是從1開始,到n-r+1。由於每次對角線的結尾處都會減1,i的結尾處與r也有關係。

每次填的j也即為對角線上的位置,j與r、i都有關係j=i+r-1

確定了迴圈的方式後,就要確定動態規劃方程。

對於dp[i][j]陣列的含義,為矩陣 i 到 矩陣 j 之前乘積的最小次數。那麼對於每一次的i與j之間的最小次數,我們都先預設從i處先斷開為最優解,然後記錄下來這個值,再從i與j之間找到乙個k,如果dp[i][k]+dp[k+1][j]+p[i-1]p[k]p[j]的值小於dp[i][j],那麼k應該為dp[i][j]中的間斷位置,在k處間斷後能使dp[i][j]有更好的乘積策略。

#include

using

namespace std;

const

int num =

105;

int p[num]

;int s[num]

[num]

;// s[i][j]表示矩陣從i到j的斷開處

int dp[num]

[num]

;// dp[i][j]表示矩陣從i乘到j的最少乘次數

void

matrixchain

(int n)}}

}}void

traceback

(int i,

int j)

else

}int

main()

p[n]

= b;

matrixchain

(n);

for(

int i =

1; i <= n;

++i)

cout << endl;

} cout << dp[1]

[n]<< endl;

traceback(1

, n)

;return0;

}/*測試用例

32 3

3 22 4

結果:28

*/

但是不得不說,遞迴起來解這道題更加簡單,乙個很基本簡單的遞迴問題,也用到了迴圈找最優解的那部分思想。

#include

using

namespace std;

const

int num =

105;

int p[num]

;int s[num]

[num]

;// s[i][j]表示矩陣從i到j的斷開處

int dp[num]

[num]

;// dp[i][j]表示矩陣從i乘到j的最少乘次數

intrecurve

(int i,

int j)

int u =

recurve

(i, i)

+recurve

(i +

1, j)

+ p[i -1]

* p[i]

* p[j]

; s[i]

[j]= i;

for(

int k = i +

1; k < j;

++k)

} dp[i]

[j]= u;

return u;

}void

traceback

(int i,

int j)

else

}int

main()

p[n]

= b;

recurve(1

, n)

;for

(int i =

1; i <= n;

++i)

cout << endl;

} cout << dp[1]

[n]<< endl;

traceback(1

, n)

;return0;

}/*32 3

3 22 4

*/

如果搜尋到i j ,就不妨把這個資料直接查詢,因為dp[i][j]本身就是儲存數值的,如果之前已經儲存了,沒必要進行多餘的操作,又叫記憶化搜尋。

**只加了一步判斷,能節省許多時間。

int

recurve

(int i,

int j)

if(i == j)

int u =

recurve

(i, i)

+recurve

(i +

1, j)

+ p[i -1]

* p[i]

* p[j]

; s[i]

[j]= i;

for(

int k = i +

1; k < j;

++k)

} dp[i]

[j]= u;

return u;

}

矩陣連乘 動態規劃 動態規劃解矩陣連乘問題

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 1 尋找最優子結構 假設我們已經找到父矩陣鏈最優解,當我們劃分到最後一步時都是兩個子矩陣鏈 分別被括號包圍 相乘,如 a1a2a3a4 a5a6a7...

python矩陣連乘 動態規劃 矩陣連乘問題

一 問題描述 給定n個數字矩陣a1,a2,an,其中ai與ai 1是可乘的,設ai是pi 1 pi矩陣,i 1,2,n。求矩陣連乘a1a2.an的加括號方法,使得所用的乘次數最少。例子三個矩陣連乘,可以有 a1a2 a3和a1 a2a3 兩種方法求積 乘法次數分別為 p0p1p2 p0p2p3和p0...

動態規劃 矩陣連乘問題

給定n 1個矩陣 a0,a1,a2,an 1 其中ai與ai 1是可乘的,i 0,1,2,n 2。矩陣乘法滿足結合律。考察這n個矩陣的連乘積,得出運算次數最少的結合。首先,考慮兩個矩陣相乘。如果a b兩個矩陣可以相乘,那麼a b的形式必定滿足 a p q b q r 設c a b,那麼c滿足c p ...