算法实验动态规划矩阵连乘Word格式.docx
《算法实验动态规划矩阵连乘Word格式.docx》由会员分享,可在线阅读,更多相关《算法实验动态规划矩阵连乘Word格式.docx(6页珍藏版)》请在冰豆网上搜索。
按给定的一组测试数据对根据算法设计的程序进行调试:
6个矩阵连乘积A=A1×
A2×
A3×
A4×
A5×
A6,各矩阵的维数分别为:
A1:
10×
20,A2:
20×
25,A3:
25×
15,A4:
15×
5,A5:
5×
10,A6:
25。
完成测试。
【算法思想及处理过程】
Main()函数:
定义二维数组m用来存放最优解;
定义二维数组s用来存放最优解的断开点;
定义一维数组p用来存放矩阵维数.
MatrixChain函数:
首先通过for循环,给二维数组M和S的对角线赋值为0(表示只有一个矩阵,没有相乘的).然后通过for循环,求出最优解(这只是假定的最优解)和断开点(这只是假定的最完美的断开点),再通过双重for循环在后面找到了一个最优解,判断后一个最优解是不是比前一个最优解小(也就是更优,更好),如果小,则将前最优解改为后一个的最优解,并且将前断开点改为后一个的断开点,然后重复此操作.
【程序代码】
#include<
stdio.h>
voidMatrixChain(intp[],intm[][6],ints[][6],intn);
//求最优解和断开点
voidprint1(intm[][6],ints[][6],intp[]);
//打印矩阵,最优解,断开点
voidprint2(inti,intn,ints[][6]);
//打印加括号的断开矩阵
intmain()
{
intp[7]={10,20,25,15,5,10,25};
intm[6][6],s[6][6];
MatrixChain(p,m,s,6);
print1(m,s,p);
printf("
\n\n矩阵连乘次数的最优值为:
\n"
);
-----------------------------------------------\n"
print2(0,6-1,s);
\n-----------------------------------------------\n\n"
return0;
}
voidMatrixChain(intp[],intm[][6],ints[][6],intn)
inti,j,k,z,t;
for(i=0;
i<
n;
i++)
{
m[i][i]=0;
s[i][i]=0;
}
for(z=2;
z<
=n;
z++)
for(i=0;
=n-z;
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<
j;
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;
}
}
}
voidprint1(intm[][6],ints[][6],intp[])
inti,j;
\n\n程序所给矩阵如下:
6;
i++)
printf("
A%d矩阵:
%2dX%-2d\n"
i+1,p[i],p[i+1]);
\n\n-----------------------------------------------\n"
printf("
矩阵的最少计算次数为:
%d\n"
m[0][5]);
\n\n数乘次数:
\n"
for(j=0;
j<
i;
j++)
printf("
"
for(j=i;
%-7d"
m[i][j]);
\n\n中间断点:
s[i][j]);
voidprint2(inti,intn,ints[][6])
if(i==n)
A%d"
i);
elseif(i+1==n)
(A%dA%d)"
i,n);
else{
("
print2(i,s[i][n],s);
print2(s[i][n]+1,n,s);
)"
【运行结果】
【算法分析】
函数MatrixChain()包含三重循环,循环体内的计算量为O
(1),所以算法的时间复杂度为O(n3),算法的空间时间复杂度为O(n3).
【实验总结】