動態規劃 矩陣連乘

2021-08-19 23:48:10 字數 1237 閱讀 3379

動態規劃常常用來解決,具有最優子結構,重疊子問題的物件。

最優子結構: 即通過分析問題,將問題分解為多個子問題。然後每個子問題繼續分解為更多子問題。從底往上求出最有值,由最優值確定最優解。

重疊子問題: 在計算過程中不同子問題可能都會計算某個值。若每個子問題都去求解同乙個值,浪費時間。動態規規劃對每乙個子問只求解一次,而後將其保留在乙個**中。當再次需要求解此子問題時,只需常數時間去檢視下是否已經計算過。

總體思路: 構造最優子結構->自底向上求出子問題最優值->由最優值確定最終的最優解 。

矩陣連乘計算次數與矩陣間的計算順序有關。因此要求出最優的計算次數。就得確定好矩陣的計算順序。

最優子結構: 。

**:

/**

@優化矩陣連乘計算次數(動態規劃)

@author 狂熱的coder

*/#include#include#define num_size 50

using namespace std;

void matrixchain(int *p,int n,int m[num_size][num_size],int s[num_size][num_size])

for(int i = 2;i<=n;i++);

for(int i = 0;i<=n;i++)

int m[num_size][num_size],s[num_size][num_size];

cout<

由矩陣間資訊可知矩陣1~6的最優計算順序為:1~6斷開點為3。分為(1~3), (4~6),1~3斷開點為1。分為(1), (2~3)。類似的往下推即可求出最優值。

( (a1(a2*a3) )*( (a4*a5)*a6 )

附上備忘錄方法:

#include#include#define n 6

using namespace std;

int m[n+1][n+1];//最優解

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

int p[n+1]= ;

int beiwanglu(int i, int j)

}m[i][j] = u;

return u;

}void f(int n)

cout

for(int i = 1;i<=n;i++)

cout

}int main()

矩陣連乘(動態規劃)

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

矩陣連乘 動態規劃

將待求解的問題分解成若干個相互聯絡的子問題,先求解子問題,然後從這些子問題的解得到原問題的解 對於重複出現的子問題,只在第一次遇到的時候對它進行求解,並把答案儲存起來,讓以後再次遇到時直接引用答案,不必重新求解。給定n個矩陣 a1,a2,an,其中ai與ai 1是可乘的,i 1,2.n 1。確定計算...