動態規劃 矩陣連乘問題

2021-07-25 03:44:51 字數 1895 閱讀 8357

看到把原始問題劃分成一系列子問題,我們很容易想到分治演算法,但是對於分治演算法,很可能會遇到子問題被重複使用

就像下面這個矩陣連乘,分解為子問題就會出現三個重複子問題,用分治演算法時,就會重複計算相同的子問題,使程式效率變得低下

對於矩陣連乘,假設a為10 * 100 的矩陣, b為100 * 5 的矩陣,c為5 * 50的矩陣,那麼有兩種情況:

1、(a * b) * c 一共要乘 10 * 100 * 5 + 10 * 5 * 50 = 7500次

2、a * (b * c) 一共要乘 100 * 5 * 50 + 10 * 100 * 50 = 750000次

可以看到,不同順序的相乘,就會有不同的時間複雜度,動態規劃就是要來求乙個最優解。

把這個括號的位置設為k,那麼(a * b) * c 的k值就為2,表示a 和 b的矩陣先乘;a * (b * c) 的 k 值為 1, 表示b 和 c的矩陣相乘。

那麼我們要做的就是如何確定這個k值,使得矩陣相乘具有最優解。

m[i, j]是指矩陣 i 到 矩陣 j 相乘的最小乘法數

p之間相乘是指拆分的矩陣之間的相乘

對於a * b * c:

m[1,3] = m[1,1] + m[2, 3] + p0 * p1 * p3 的意思是 a * (b * c)

m[1,3] = m[1,2] + m[3, 3] + p0 * p2 * p3 的意思是 (a * b) * c

也可以用這個圖來理解

例如求m[1, 3] 就是 求 m[1, 1] 和 m[2, 3] 或者 求 m[1, 2] 和 m[3, 3。

#include 

#include

#include

using

namespace

std;

#define size 100

#define inf 999999999

int p[size];

int m[size][size]; //存放矩陣鏈計算的最優值,d[i][j]為第i個矩陣到第j個矩陣的矩陣鏈的最優值

int best_dp(int n)

} m[i][j] = min;

} }

return m[1][n];

} int main(void)

printf("%d\n", best_dp(n));

} return

0;

}

這裡需要注意的是:

n是指相乘的矩陣數目

p用來存放各矩陣的資訊: 用p[i - 1] 和 p[i]來表示第i個矩陣的行和列,例如 a為10 * 100 的矩陣, b為100 * 5 的矩陣,c為5 * 50的矩陣,則p[0] = 10 , p[1] = 100, p[2] = 5 , p[3] = 50

m[i, j]用來表示i 到 j矩陣相乘的最優解

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

一.矩陣鏈事例 矩陣鏈問題主要涉及的時在多個矩陣相乘,如何通過相乘的順序來減少程式執行。二.例題分析 這次分析過程按照動態規劃的三個基本條件來逐步解答 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 ...