算法实验动态规划----矩阵连乘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三:动态规划法
【实验目的】
深入理解动态规划算法的算法思想,应用动态规划算法解决实际的算法问题。
【实验性质】
验证性实验。
【实验要求】
对于下列所描述的问题,给出相应的算法描述,并完成程序实现与时间复杂度的分析。该问题描述为:一般地,考虑矩阵A1,A2,…,An的连乘积,它们的维数分别为d0,d1,…,dn,即Ai的维数为di-1×di (1≤i≤n)。确定这n个矩阵的乘积结合次序,使所需的总乘法次数最少。对应于乘法次数最少的乘积结合次序为这n个矩阵的最优连乘积次序。按给定的一组测试数据对根据算法设计的程序进行调试:6个矩阵连乘积A=A1×A2×A3×A4×A5×A6,各矩阵的维数分别为:A1:10×20,A2:20×25,A3:25×15,A4:15×5,A5:5×10,A6:10×25。完成测试。
【算法思想及处理过程】
【程序代码】
printf ("\n\n矩阵连乘次数的最优值为:\n");
printf ("-----------------------------------------------\n");
print2 (0, 6-1, s);
printf ("\n-----------------------------------------------\n\n");
return 0;
}
void MatrixChain (int p[], int m[][6], int s[][6], int n)
{
int i, j, k, z, t;
for (i=0; i { m[i][i] = 0; s[i][i] = 0; } for (z=2; z<=n; z++) for (i=0; i<=n-z; i++) { j = i + z - 1; m[i][j] = m[i+1][j] + p[i] * p[i+1] * p[j+1]; s[i][j] = i; for (k = i+1; k { t = m[i][k] + m[k+1][j] + p[i] * p[k+1] * p[j+1]; if (t < m[i][j]) { m[i][j] = t; s[i][j] = k; } } } } void print1 (int m[][6], int s[][6],int p[]) { int i, j; printf ("\n\n程序所给矩阵如下:\n"); printf ("-----------------------------------------------\n"); for (i=0; i<6; i++) printf ("A%d 矩阵: %2d X %-2d \n",i+1,p[i], p[i+1]); printf ("\n\n-----------------------------------------------\n"); printf("矩阵的最少计算次数为:%d\n", m[0][5]); printf ("-----------------------------------------------\n"); printf ("\n\n数乘次数: \n"); printf ("-----------------------------------------------\n"); for (i=0; i<6; i++) { for (j=0; j printf (" "); for (j=i; j<6; j++) printf ("%-7d", m[i][j]); printf ("\n"); } printf ("-----------------------------------------------\n"); printf ("\n\n中间断点: \n"); printf ("-----------------------------------------------\n"); for (i=0; i<6; i++) { for (j=0; j printf (" "); for (j=i; j<6; j++) printf ("%-7d", s[i][j]); printf ("\n"); } printf ("-----------------------------------------------\n"); } void print2(int i, int n, int s[][6]) { if (i == n) 【运行结果】 【算法分析】 函数MatrixChain( )包含三重循环,循环体内的计算量为O(1) , 所以算法的时间复杂度为O(n3) ,算法的空间时间复杂度为O(n3) . 【实验总结】