矩阵链相乘算法(动态规划)--算法导论示例 - 付之东流 - CSDNBlog

导读:
作为经典的动态规划算法举例,矩阵连乘问题很好地展现了动态规划的特点和实用价值。给定n个矩阵{A1,A2,...,An},其中Ai与Ai+1是可乘的,i=1,2,...n-1。现在要计算这n个矩阵的连乘积。由于矩阵的乘法满足结合律,所以通过加括号可以使得计算矩阵的连乘积有许多不同的计算次序。然而采用不同的加扩号方式,所需要的总计算量是不一样的。若A是一个p*q矩阵,B是一个q*r矩阵,则其乘积C=AB是一个p*r矩阵。如果用标准算法计算C,总共需要pqr次数乘。

   现在来看一个例子。A1,A2,A3分别是10*100,100*5和5*50的矩阵。如果按照((A1A2)A3)来计算,则计算所需的总数乘次数是10*100*5+10*5*50=7500。如果按照(A1(A2A3))来计算,则需要的数乘次数是100*5*50+10*100*50=75000,整整是前者的10倍。由此可见,在计算矩阵连乘积时,不同的加括号方式所导致的不同的计算对计算量有很大的影响。如何确定计算矩阵连乘积A1A2,...,An的一个计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少便成为一个问题。



#include  < stdio.h >
#include 
< limits.h >
#define  LENGTH 6

void  MatrixChainOrder( int  p[], int  m[][LENGTH], int  s[][LENGTH])
{
    
int n=LENGTH;

    
for(int i=0;i<n;i++)
        m[i][i]
=0;

    
for(int L=2;L<=n;L++)
        
for(int i=1;i<=n-L+1;i++)
        
{
            
int j=i+L-1;
            m[i
-1][j-1]=INT_MAX;
            
for(int k=i;k<=j-1;k++)
            
{
                
int q=m[i-1][k-1]+m[k][j-1]+p[i-1]*p[k]*p[j];
                
if(q<m[i-1][j-1])
                
{
                    m[i
-1][j-1]=q;
                    s[i
-1][j-1]=k;
                }

            }

        }

}


void  PrintOptimalParens( int  s[][LENGTH], int  i, int  j)
{
    
if(i==j)
        printf(
"A%d",i);
    
else
    
{
        printf(
"(");
        PrintOptimalParens(s,i,s[i
-1][j-1]);
        PrintOptimalParens(s,s[i
-1][j-1]+1,j);
        printf(
")");
    }

}


int  main()
{
    
int p[]={30,35,15,5,10,20,25};
    
int m[LENGTH][LENGTH];
    
int s[LENGTH][LENGTH];

    MatrixChainOrder(p,m,s);
    PrintOptimalParens(s,
1,6);
    
return 0;
}



本文转自
http://blog.csdn.net/hedongfu/archive/2006/09/22/1267237.aspx
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值