動態規劃常常用來解決,具有最優子結構,重疊子問題的物件。
最優子結構: 即通過分析問題,將問題分解為多個子問題。然後每個子問題繼續分解為更多子問題。從底往上求出最有值,由最優值確定最優解。
重疊子問題: 在計算過程中不同子問題可能都會計算某個值。若每個子問題都去求解同乙個值,浪費時間。動態規規劃對每乙個子問只求解一次,而後將其保留在乙個**中。當再次需要求解此子問題時,只需常數時間去檢視下是否已經計算過。
總體思路: 構造最優子結構->自底向上求出子問題最優值->由最優值確定最終的最優解 。
矩陣連乘計算次數與矩陣間的計算順序有關。因此要求出最優的計算次數。就得確定好矩陣的計算順序。
最優子結構: 。
**:
/**
@優化矩陣連乘計算次數(動態規劃)
@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。確定計算...