矩陣鏈乘 動態規劃

2021-08-19 15:22:42 字數 2188 閱讀 9907

//普通矩陣相乘

#define row_a 2

#define col_a 2

#define col_b 3

void matrix_mul(int mata[row_a][col_a], int matb[2][col_b], int c[row_a][col_b])}}

}

兩個相容矩陣相乘,相容是指矩陣a的行必須等於矩陣b的列。

利用矩陣相乘的定義計算,cij = ∑ aik * bkj (k = 1……a.col)。

需要注意的是aik 和 bhj 規模的兩個矩陣相乘後,矩陣規模會變為 cij,而兩個矩陣相乘的代價是i * j* k.

之後的所有演算法都會用到矩陣的規模和代價。

約定 ai……j 表示矩陣ai 一直乘到 aj 的乙個矩陣鏈

做出乙個選擇,選擇n個矩陣在第k個位置劃分

假定我已經知道在第k個位置劃分後代價最優

給定可獲得最優解的選擇後,確定選擇會產生那些子問題,(產生ai……k 和 ak+1……..j 兩個矩陣鏈乘的子問題),以及如何刻畫子問題解空間

剪下貼上技術證明,原問題的最優解包含子問題的最優解。因為如果子問題的解不是最優解,那麼把子問題的最優解代入原問題中就能得到更優的原問題解,所以證明了子問題的解也必定是最優的。

原問題產生的兩個子問題解空間形式不太一樣,例如a1……k ,ak+1…….j ,後者的形式和原問題a1…….j的形式不同,必須允許子問題i,j均可變,所以用m[i][j]記錄解空間.

原問題的最優解涉及多少個子問題?

在確定最優解使用那些子問題時,需要考察多少種選擇?

答案是:最優解使用兩個子問題,需要考察j-i種選擇。

兩個子問題是ai……k ,和ak+1…….j 各自的最優解,還要考察k在i 到 j 之間取值最優的。

m[i][j] 表示ai….j個矩陣相乘的最小代價,最優解就是m[1][n]——即從第乙個矩陣乘到最後乙個矩陣的代價。

i = j 時,就是乙個矩陣乘自己,代價為0

i < j 時,在k處劃分並且考察所有k的選擇,m[i][j] = min(m[i][k] +m[k+1][j] + pi-1 * pk *pj)(k = i…….j-1)

上面是求解動歸的最重要部分,基本可以直接寫出遞迴的方法了↓

//矩陣規模,例如a1=30*35,a2=35*15

int p = ;

#define n 6 //矩陣長度

int m[n+1][n+1] = ;

int s[n + 1][n + 1] = ;

//直接遞迴法,i=1,j=6

int recursive(int p, int i, int j)

m[i][j] = _crt_int_max;

for (int k = i; k < j; k++)

}return m[i][j];

}

當遞迴呼叫第一次遇到子問題就求其解,記錄。以後再遇到直接查表返回。

//帶備忘的遞迴

void memorize(int m[n + 1][n + 1])

}}int lookup(int p, int i, int j)

if (i == j)

for (int k = i; k < j; k++)

}return m[i][j];

}

為了實現自底向上法,必須確定計算m[i][j]時訪問哪些表項。由上面的遞迴定義式看,m[i][j] 的一次計算需要求所有k的選擇的子問題的解中最優的,而k在i…j中取值,意味著需要訪問的子問題的矩陣規模一定小於原問題。所以設計求解順序為按矩陣鏈長度從短到長。

而且自底向上需要求出所有的子問題解,m[i][j]合法解空間會被填滿,所以迴圈考慮每個長度,每個起始結束點的矩陣鏈,最後返回最優代價是m[1][n].

//自底向上

int matrix_order(int p)

//設計求解順序,按長度

for (int len = 2; len <= n; len++) }}

}return m[1][n];

}//構造最優解

void print(int s[n+1][n+1], int i, int j)

else

}

C 動態規劃 矩陣鏈乘

c 動態規劃 矩陣鏈乘 1 問題描述 給定n個矩陣構成的乙個鏈給定 a1,a2,an 其中i 1,2,n.矩陣ai的維數為pi 1 pi,如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。2 最優子結構 對乘積a1a2.an的任意加括號方法都會將序列在某個地方分成兩部分...

最優矩陣鏈乘 動態規劃

給定n個矩陣 a1,a2,an 其中ai與ai 1是可乘的,i 1,2 n 1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。解答 我們按照動態規劃的幾個步驟來分析 1 找出最優解的性質,刻畫其特徵結構 對於矩陣連乘問題,最優解就是找到一種計算順序,使得計算次數最少...

動態規劃經典問題 矩陣鏈乘

問題描述 給定n個矩陣,其中ai與ai 1是可乘的,i 1,2,3.n 1.考慮這n個矩陣的乘積。由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算機次序。這種計算次序可以用加括號的方式確定。若乙個矩陣鏈乘的計算次序完全確定,這時就說該鏈乘已完全加括號。完全加括號的矩陣鏈乘可遞迴的定義如...