算法实验动态规划矩阵连乘.docx

上传人:b****3 文档编号:5297046 上传时间:2022-12-15 格式:DOCX 页数:6 大小:40.12KB
下载 相关 举报
算法实验动态规划矩阵连乘.docx_第1页
第1页 / 共6页
算法实验动态规划矩阵连乘.docx_第2页
第2页 / 共6页
算法实验动态规划矩阵连乘.docx_第3页
第3页 / 共6页
算法实验动态规划矩阵连乘.docx_第4页
第4页 / 共6页
算法实验动态规划矩阵连乘.docx_第5页
第5页 / 共6页
点击查看更多>>
下载资源
资源描述

算法实验动态规划矩阵连乘.docx

《算法实验动态规划矩阵连乘.docx》由会员分享,可在线阅读,更多相关《算法实验动态规划矩阵连乘.docx(6页珍藏版)》请在冰豆网上搜索。

算法实验动态规划矩阵连乘.docx

算法实验动态规划矩阵连乘

实验三:

动态规划法

【实验目的】

深入理解动态规划算法的算法思想,应用动态规划算法解决实际的算法问题。

【实验性质】

验证性实验。

【实验要求】

对于下列所描述的问题,给出相应的算法描述,并完成程序实现与时间复杂度的分析。

该问题描述为:

一般地,考虑矩阵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。

完成测试。

【算法思想及处理过程】

Main()函数:

定义二维数组m用来存放最优解;定义二维数组s用来存放最优解的断开点;定义一维数组p用来存放矩阵维数.

MatrixChain函数:

首先通过for循环,给二维数组M和S的对角线赋值为0(表示只有一个矩阵,没有相乘的).然后通过for循环,求出最优解(这只是假定的最优解)和断开点(这只是假定的最完美的断开点),再通过双重for循环在后面找到了一个最优解,判断后一个最优解是不是比前一个最优解小(也就是更优,更好),如果小,则将前最优解改为后一个的最优解,并且将前断开点改为后一个的断开点,然后重复此操作.

 

【程序代码】

#include

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");

printf("-----------------------------------------------\n");

print2(0,6-1,s);

printf("\n-----------------------------------------------\n\n");

return0;

}

voidMatrixChain(intp[],intm[][6],ints[][6],intn)

{

inti,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]=t;

s[i][j]=k;

}

}

}

}

voidprint1(intm[][6],ints[][6],intp[])

{

inti,j;

printf("\n\n程序所给矩阵如下:

\n");

printf("-----------------------------------------------\n");

for(i=0;i<6;i++)

printf("A%d矩阵:

%2dX%-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");

}

voidprint2(inti,intn,ints[][6])

{

if(i==n)

printf("A%d",i);

elseif(i+1==n)

printf("(A%dA%d)",i,n);

else{

printf("(");

print2(i,s[i][n],s);

print2(s[i][n]+1,n,s);

printf(")");

}

}

【运行结果】

【算法分析】

函数MatrixChain()包含三重循环,循环体内的计算量为O

(1),所以算法的时间复杂度为O(n3),算法的空间时间复杂度为O(n3).

 

【实验总结】

 

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1