实验报告
课程名称 《算法分析与设计》 实验日期 2021 年 4 月 25 日 至 2021 年 4 月 25日
学生姓名 石晨昊 所在班级 计算机194 学号 2019212212322
实验名称 投资问题
实验地点 同组人员
1.问题
矩阵链乘法
2.解析
只有当矩阵A的列数与矩阵B的行数相等时A×B才有意义。一个m×r的矩阵A左乘一个r×n的矩阵B,会得到一个m×n的矩阵C。在计算机中,一个矩阵说穿了就是一个二维数组。一个m行r列的矩阵可以乘以一个r行n列的矩阵,得到的结果是一个m行n列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的r个数与后一个矩阵第j列上的r个数对应相乘后所有r个乘积的和。
3.设计
void matrixChainOrder(int p[],int length,int m[][N],int s[][N])
{
int i,l,j,k;
int q;
for(i=0;i<length;++i)
m[i][i]=0;//记录矩阵所需标量乘法的最小值
for(l=2;l<length;++l)//l为矩阵链的长度
{
for(i=1;i<length-l+1;++i)
{
j=i+l-1;
m[i][j]=100000;
for(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;//s[][]记录构造最优解所需信息
}
}
}
}
}
void printOptimalParents(int s[][N],int i,int j)//输出最优解函数
{
if(i==j)
cout<<"A"<<i;
else
{
cout<<"(";
printOptimalParents(s,i,s[i][j]);
printOptimalParents(s,s[i][j]+1,j);
cout<<")";
}
}
4.分析
用动态规划算法解矩阵链乘法问题需要时间为O(n3),空间为O(n2),
5.源码
https://github.com/695950719/Algorithm-design/blob/main/%E7%9F%A9%E9%98%B5%E9%93%BE%E4%B9%98%E6%B3%95.cpp