矩陣連乘問題

2021-07-08 10:49:24 字數 1906 閱讀 8983

題目描述:給定n個矩陣{a1,a2,…,an},其中ai與ai+1是可乘的,i=1,2 ,…,n-1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。例如:

a1= ; a2= ;a3= ;a4= ;a5= ;a6= ;

最後的結果為:((a1(a2a3))((a4a5)a6))  最小的乘次為15125。

解題思路:能用動態規劃的乙個性質就是最優子結構性質,也就是說計算a[i:j]的最優次序所包含的計算矩陣子璉a[i:k]和a[k+1:j]的次序也是最優的。動態規劃演算法解此問題,可依據其遞迴式以自底向上的方式進行計算(即先從最小的開始計算)。在計算過程中,儲存已解決的子問題答案。每個子問題只計算一次,而在後面需要時只要簡單查一下,從而避免大量的重複計算,最終得到多項式時間的演算法。我們可以根據下面這個公式來計算結果。其中p[i-1]表示的是第i個矩陣的行數,p[k]表示i:k矩陣合起來後最後得到的列數,p[j]是k+1:j合起來後得到的列數。這個部分的計算方法其實就是計算兩個矩陣相乘時總共的乘次數,自己琢磨琢磨就明白了。

從連乘矩陣個數為2開始計算每次的最小乘次數m[i][j]: m[0][1] m[1][2] m[2][3] m[3][4] m[4][5]  //m[0][1]表示第乙個矩陣與第二個矩陣的最小乘次數

然後再計算再依次計算連乘矩陣個數為3:m[0][2] m[1][3] m[2][4] m[3][5]

連乘矩陣個數為4:m[0][3] m[1][4] m[2][5]

連乘矩陣個數為5:m[0][4] m[1][5]

連乘矩陣個數為6:m[0][5]    //即最後我們要的結果

**:

#include #include 

#define max 100

int matrix_chain(int *p, int n, int **m, int **s)

for (r = 2; r <= n; r++) //

r為連乘矩陣的個數}}

}return m[0][n-1];}

void print_chain(int i, int j, char **a,int **s)

else

}int

main()

p[0] = 30; //

第乙個矩陣的行數

p[1] = 35; //

第二個矩陣的行數

p[2] = 15; //

…… p[3] = 5; //

……

p[4] = 10; //

…… p[5] = 20; //

第六個矩陣的行數

p[6] = 25; //

第六個矩陣的列數

a[0] = "a1"

; a[

1] = "a2"

; a[

2] = "a3"

; a[

3] = "a4"

; a[

4] = "a5"

; a[

5] = "a6"

;

ret =matrix_chain(p,n,min_part,min_point);

printf(

"minest times:%d.\n

",ret);

print_chain(

0,n-1

,a,min_point);

free(p);

free(min_part);

free(min_point);

free(a);

return0;

}2013/8/1 23:38

矩陣連乘問題

矩陣連乘問題 應用動態規劃演算法,將前面計算的重複值儲存,一次來推進下一步的計算,直到得到m 1 n 的值,為最少的乘法次數 m i j 表示計算a i.j 所需的最少數乘次數 m i j min i s i j 記錄斷開位置,也就是最少計算次數的中間位置。include using namespa...

矩陣連乘問題

由於矩陣的乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序。這中計算次序 可以用加括號的方式來確定。例如,矩陣連乘積a1a2a3a4可以有5種不同的完全加括號方式 a1 a2 a3a4 a1 a2a3 a4 a1a2 a3a4 a1 a2a3 a4 a1a2 a3 a4 矩陣a和b可乘的條...

矩陣連乘問題

矩陣連乘問題 問題分析 最優子結構性質假設n個矩陣連乘的最優加括號方案為 a1.ak ak 1.an 注 此處省略了a1.ak,ak 1.an兩個子矩陣內部的括號 則加括號方案 a1.ak 是子矩陣鏈a1.ak的最優加括號方案,ak 1.an 是ak 1.an的最優加括號方案。證明略。但可證明該假設...