矩陣連乘 動態規劃

2021-08-30 19:28:08 字數 2089 閱讀 8266

將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解;對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來,讓以後再次遇到時直接引用答案,不必重新求解。

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

由於矩陣乘法滿足結合律,故計算矩陣的連乘積可以有許多不同的計算次序。這種計算次序可以用加括號的方式來確定。若乙個矩陣連乘積的計算次序完全確定,也就是說該連乘積已完全加括號,則可以依此次序反覆呼叫2個矩陣相乘的標準演算法計算出矩陣連乘積。

完全加括號的矩陣連乘積可遞迴地定義為:

(1)單個矩陣是完全加括號的;

(2)矩陣連乘積a是完全加括號的,則a可表示為2個完全加括號的矩陣連乘積b和c的乘積並加括號,即a=(bc)

例如,矩陣連乘積a1a2a3有2種不同的完全加括號的方式:

((a1*a2)*a3), (a1*(a2*a3))

每一種完全加括號的方式對應於乙個矩陣連乘積的計算次序,這決定著作乘積所需要的計算量。

a1*a2  a1:10*25, a2:25*35  則a1*a2=10*25*35 即兩個矩陣相乘等於第乙個矩陣的行數*列數*第二個矩陣的列數

看下面乙個例子,計算三個矩陣連乘;維數分別為10*100 , 100*5 , 5*50

按此順序計算需要的次數((a1*a2*a3):10x100x5+10x5x50=7500次,

按此順序計算需要的次數(a1*(a2*a3)):10*5*50+10*100*50=75000次

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

假設p=; 表示有六個矩陣,維數分別為:10*5  5*2  2*8  8*4  4*9  9*10

從連乘矩陣個數為2開始計算每次的最小乘次數m[i][j]:

m[1][2] m[2][3] m[3][4]  m[4][5]     //m[1][2]表示第乙個矩陣與第二個矩陣的最小乘次數

然後再計算再依次計算連乘矩陣個數為3:

m[1][3] m[2][4] m[3][5] m[4][6]

連乘矩陣個數為4:

m[1][4] m[2][5] m[3][6]

連乘矩陣個數為5:m[1][5] m[2][6]

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

package dongtaiguihua;

public class matrixchain1

for(int r=2;r}}

}matrixdivide(1,n-1,s);

system.out.println(m[1][n-1]);

}public static void matrixdivide(int i,int j,int s)//矩陣的斷開位置

matrixdivide(i,s[i][j],s);

matrixdivide(s[i][j]+1,j,s);

int x = s[i][j] + 1;

system.out.print("multipy a" + i + "," + s[i][j]);

system.out.println(" and a" + x + "," + j);

}public static void main(string args)

;//傳入的要連乘的矩陣的維數資訊的陣列

matrixchain(p);}}

矩陣連乘(動態規劃)

題目描述 給定n個矩陣 a1,a2,an 其中ai與ai 1是可乘的,i 1,2 n 1。如何確定計算矩陣連乘積的計算次序,使得依此次序計算矩陣連乘積需要的數乘次數最少。例如 a1 a2 a3 a4 a5 a6 最後的結果為 a1 a2a3 a4a5 a6 最小的乘次為15125。思路 動態規劃演算...

動態規劃 矩陣連乘

includeusing namespace std 無論括號怎麼分這些連續相乘的矩陣,最後括號都可以歸結到只有兩對括號,把整個連乘的矩陣分成兩部分 0 i j m i j min i 遞迴計算矩陣連乘 int liancheng int i,int j,int p,int s return min...

動態規劃 矩陣連乘

動態規劃常常用來解決,具有最優子結構,重疊子問題的物件。最優子結構 即通過分析問題,將問題分解為多個子問題。然後每個子問題繼續分解為更多子問題。從底往上求出最有值,由最優值確定最優解。重疊子問題 在計算過程中不同子問題可能都會計算某個值。若每個子問題都去求解同乙個值,浪費時間。動態規規劃對每乙個子問...