3 矩陣連乘問題

2022-06-19 14:03:10 字數 1305 閱讀 5420

(1)   矩陣鏈連乘問題:

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

輸入資料:共m+1行;第一行為測試資料的組數m;以後每行n+1個正   整數,表示n個矩陣的行列值。

輸出:最少次數及連乘的計算次序。

樣例輸入:

5 10 4 6 10 2

樣例輸出:

(a1(a2(a3(a4a5))))

思路:1.最優子結構:將aiai+1...aj 記為 a[ i : j ]。計算 a[ 1 : n ]的最優計算序列,設這個計算次序在矩陣ak(1<= k <= n)和 ak+1之間把矩陣連乘斷開,其相應的加括號的方式為( ( a1+...+ak ) ( ak+1+...+an ) )。它的子鏈也是最優的(反證法)。

count(a[1:n]) = count(a[1:k])+ count(a[k+1:n])+ count(a[1:k] * a[k+1:n])

2.遞推關係式:

記對於a[ i : j ] 所需的最少乘法次數為m[ i ][ j ]。

m[ i ][ j ] = 0 (i == j)

m[ i ][ j ] = min (i ≤ k ≤ j,i < j)

3.計算最優值

直接遞迴耗時o(n2),採取記憶化儲存結果。

code:

#include#include

#include

using

namespace

std;

int inf = 0x3f3f3f3f

;const

int maxn = 1000

;vector

a;intm[maxn][maxn];

ints[maxn][maxn];

intn;

struct

pos*p;

void extract (string &s)

a.push_back(x);

}}void trace(int i, int

j) void

solve() }}

}}int

main()

*/cout

<< m[1][n]

1,n);

for (char i = '

1'; i <= '

0'+n; i++)

}return0;

}

矩陣連乘問題

矩陣連乘問題 應用動態規劃演算法,將前面計算的重複值儲存,一次來推進下一步的計算,直到得到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的最優加括號方案。證明略。但可證明該假設...