如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
矩阵连乘算法(完整版)实用资料(可以直接使用,可编辑完整版实用资料,欢迎下载)福州大学数学与计算机科学学院《计算机算法设计与分析》上机实验报告(2)i<=k<j,则:m[i][j]=m[i][k]+m[k+1][j]+pi-1pkpj。由于在计算是并不知道断开点k的位置,所以k还未定。不过k的位置只有j-i个可能。因此,k是这j-i个位置使计算量达到最小的那个位置。综上,有递推关系如下:若将对应m[i][j]的断开位置k记为s[i][j],在计算出最优值m[i][j]后,可递归地由s[i][j]构造出相应的最优解。s[i][j]中的数表明,计算矩阵链A[i:j]的最佳方式应在矩阵Ak和Ak+1之间断开,即最优的加括号方式应为(A[i:k])(A[k+1:j)。从s[1][n]记录的信息可知计算A[1:n]的最优加括号方式为(A[1:s[1][n]])(A[s[1][n]+1:n]),进一步递推,A[1:s[1][n]]的最优加括号方式为(A[1:s[1][s[1][n]]])(A[s[1][s[1][n]]+1:s[1][s[1][n]]])。同理可以确定A[s[1][n]+1:n]的最优加括号方式在s[s[1][n]+1][n]处断开...照此递推下去,最终可以确定A[1:n]的最优完全加括号方式,及构造出问题的一个最优解。3、动态规划迭代算法设计:用动态规划迭代方式解决此问题,可依据其递归式自底向上的方式进行计算。在计算过程中,保存已解决的子问题的答案。每个子问题只计算一次,而在后面需要时只需简单检查一下,从而避免了大量的重复计算,最终得到多项式时间的算法。4、算法代码:1.//3d1-2矩阵连乘动态规划迭代实现2.//A130*35A235*15A315*5A45*10A510*20A620*253.//p[0-6]={30,35,15,5,10,20,25}4.#include"stdafx.h"5.#include<iostream>6.usingnamespacestd;7.8.constintL=7;9.10.intMatrixChain(intn,int**m,int**s,int*p);11.voidTraceback(inti,intj,int**s);//构造最优解12.13.intmain()14.{15.intp[L]={30,35,15,5,10,20,25};16.17.int**s=newint*[L];18.int**m=newint*[L];19.for(inti=0;i<L;i++)20.{21.s[i]=newint[L];22.m[i]=newint[L];23.}24.25.cout<<"矩阵的最少计算次数为:"<<MatrixChain(6,m,s,p)<<endl;26.cout<<"矩阵最优计算次序为:"<<endl;27.Traceback(1,6,s);28.return0;29.}30.31.intMatrixChain(intn,int**m,int**s,int*p)32.{33.for(inti=1;i<=n;i++)34.{35.m[i][i]=0;36.}37.for(intr=2;r<=n;r++)//r为当前计算的链长(子问题规模)38.{39.for(inti=1;i<=n-r+1;i++)//n-r+1为最后一个r链的前边界40.{41.intj=i+r-1;//计算前边界为r,链长为r的链的后边界42.43.m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];//将链ij划分为A(i)*(A[i+1:j])44.45.s[i][j]=i;46.47.for(intk=i+1;k<j;k++)48.{49.//将链ij划分为(A[i:k])*(A[k+1:j])50.intt=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];51.if(t<m[i][j])52.{53.m[i][j]=t;54.s[i][j]=k;55.}56.}57.}58.}59.returnm[1][L-1];60.}61.62.voidTraceback(inti,intj,int**s)63.{64.if(i==j)return;65.Traceback(i,s[i][j],s);66.Traceback(s[i][j]+1,j,s);67.cout<<"MultiplyA"<<i<<","<<s[i][j];68.cout<<"andA"<<(s[i][j]+1)<<","<<