1、题目
给定向量P,确定一种乘法次序,使得基本运算的总次数达到最小。
2、解析
对于矩阵链乘法问题,我们将所有对于1<=i<=j<=n确定A i A i+1 …A j 的最小代价括号方案作为子问题。令m[i,j]表示计算矩阵A i,j 所需要的标量乘法的次数最小值,则最优解就是计算A i…n所需的最低代价就是m[1,n]
如:
3、设计
4、分析
T(n)=O(n^3)
5、源码
#include<bits/stdc++.h>
using namespace std;
const int maxn=0x3f3f3f3f;
int const M=7;
void MatrixChain(int *p,int Length,int m[][M],int s[][M]){
int q,n=Length-1;
for(int i=1;i<=n;i++) m[i][i]=0;
for(int l=2;l<=n;l++){ /* 矩阵链的长度 */
for(int i=1;i<=n-l+1;i++){
int j=i+l-1; /* 等价于 l=j-i+1 */
m[i][j]=INT_MAX;
for(int k=i;k<=j-1;k++){
q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(q<m[i][j]){
m[i][j]=q;
s[i][j]=k;
}
}
}
}
}
void slove(int s[][M],int i,int j){
if(i == j) cout<<"A"<<i;
else{
cout<<"(";
slove(s,i,s[i][j]);
slove(s,s[i][j]+1,j);
cout<<")";
}
}
int main(){
int p[M]={30,35,15,5,10,20,25};
int m[M][M],s[M][M];
MatrixChain(p,M,m,s);
cout<<"当n=6时最优解为: \n"<<m[1][6];
cout<<"\n括号化方案为:\n";
slove(s,1,6);
return 0;
}