对于一个矩阵,进行乘法的顺序不一样,总的元素的乘法次数也不同。我们希望给出一系列矩阵之后,能找到元素乘法次数最少的计算顺序。
用动态规划来求解这个问题。
/*
* =====================================================================================
*
* Filename: MatrixMul.cpp
*
* Description:
*
* Version: 1.0
* Created: 2011年12月01日 10时43分13秒
* Revision: none
* Compiler: gcc
*
* Author: MaZheng (blog.csdn.net/mazheng1989), mazheng19891019@gmail.com
* Company: Dalian University Of Technology
*
* =====================================================================================
*/
#include<stdio.h>
const int n=4;
int Matrix[n][2]={20,2,2,15,15,40,40,4};
int cost[n][n];
int root[n][n];
int Proc(int i,int r,int j)
{
return Matrix[i][0]*Matrix[r][1]*Matrix[j][1];
}
int pri(int i,int r,int j)
{
if(i==r&&r==j)
return -1;
pri(i,root[i][r],r);
pri(r+1,root[r+1][j],j);
printf(" %d ",root[i][j]+1);
}
int main()
{
for(int i=n-1;i>=0;i--)
{
for(int j=i;j<=n-1;j++)
{
if(j==i)
{
cost[i][j]=0;
root[i][j]=i;
continue;
}
for(int r=i;r<=j-1;r++)
{
int temp=cost[i][r]+cost[r+1][j]+Proc(i,r,j);
if(cost[i][j]==0)
{
cost[i][j]=temp;
root[i][j]=r;
}
else if(cost[i][j]!=0&&cost[i][j]>=temp)
{
cost[i][j]=temp;
root[i][j]=r;
}
}
// printf("%d %d %d %d \n",i+1,j+1,cost[i][j],root[i][j]+1);
}
}
printf("least multiply times = %d\n",cost[0][n-1]);
printf("compute sequece is:\n");
pri(0,root[0][n-1],n-1);
}