動態規劃(矩陣連乘)

2021-10-05 02:34:11 字數 1543 閱讀 2278

題目描述:

給定n個矩陣{a1,a2,…,an},其中,ai與ai+1是可乘的,(i=1,2 ,…,n-1)。用加括號的方法表示矩陣連乘的次序,不同的計算次序計算量(乘法次數)是不同的,找出一種加括號的方法,使得矩陣連乘的次數最小。

例如:

a1是a(5*10)的方陣;

a2是a(10*100)的方陣;

a3是a(100*2)的方陣;

那麼有兩種加括號的方法:

(a1a2)a3;

a1(a2a3);

第一種方法的計算量:5*10*100+5*100*2=6000;

第二種方法的計算量:10*100*2+5*10*2=2100;

可以看出不同計算方法計算量差別很大。

問題分析:例如:a(3*2),b(2*4)

可知總執行次數為:3*2*4=24.

所以矩陣am*n和bn*k的乘法運算次數為:m*n*k;

現給出陣列p = ,其中第0個數是第乙個矩陣的行數,第乙個到第六個分別為六個矩陣的列數

動態規劃實現(自己寫的,但是步驟基本一致)(時間複雜度較低)

public class matrixmultiply ;

int m = new int[p.length][p.length];

int s = new int[p.length][p.length];

multiply(m,s,p);

for (int i = 0; i < m.length; i++)

system.out.println();

} system.out.println();

for (int i = 0; i < s.length; i++)

system.out.println();

} }private static void multiply(int m, int s, int p) else}}

m[begin][end] = temp1;

s[begin][end] = temp2;

}} }

}

迭代實現(時間複雜度較高)

public class matrixmultiply ;	//這是六個矩陣的橫縱長度,第0個數是第乙個矩陣的行數,1到6分別是第1到第6個矩陣的列數

public static void main(string args)

public static int getmatrixchain(int i, int j)

for (int r = i+1; r <= j-1; r++)

if (min > time)

} return min;

}}

矩陣連乘(動態規劃)

題目描述 給定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...

動態規劃 矩陣連乘

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