您的位置:首页 > 其它

矩阵链乘法(算法导论)

2014-03-26 19:18 435 查看
#include <iostream>

#include <stdio.h>

using namespace std;

int com[100][100];

///////////////////////////////////注意这段改进的乘法结合方式输出的实现

void combine(int i, int j)

{

    if(i==j)

    {

       printf("M%d",i);

       return;

    }

    if(i==j-1)

    {

       printf("M%d*M%d",i,j);

       return;

    }

    if(i==com[i][j])

    {

       combine(i,com[i][j]);

       printf("*");

    }

    else

    {

       printf("(");

       combine(i,com[i][j]);

       printf(")*");

    }

    if(j==com[i][j]+1)

    {

       combine(com[i][j]+1,j);

    }

    else

    {

       printf("(");

       combine(com[i][j]+1,j);

       printf(")");

    }

}

int  main(int argc, char* argv[])

{

    int r[100], n, m[100][100]={0},s,t,k,j,i;

    printf("How many matrixes?\n");

    cin>>n;

    printf("How size every matrix?\n");

    for(i=1;i<=n+1;++i)

       cin>>r[i];

    for(i=1;i<=n;++i)

       for(j=1;j<=n;++j)

           com[i][j]=0;

    m

=0;

    for(i=1;i<n;++i)

    {

       m[i][i]=0;

       m[i][i+1]=r[i]*r[i+1]*r[i+2];

       com[i][i+1]=i;

    }

    for(s=2;s<=n-1;++s)

       for(i=1;i<n-s+1;++i)

       {

           j=i+s;

           m[i][j]=m[i+1][j]+r[i]*r[i+1]*r[j+1];

           com[i][j]=i;

           for(k=i+1;k<j;k=k+1)

           {

              t=m[i][k]+m[k+1][j]+r[i]*r[k+1]*r[j+1];

              if(t<m[i][j])

              {

                  m[i][j]=t;

                  com[i][j]=k;

              }

           }

       }

    printf("最后的计算策略:");

    printf("\n组合方式:");

    for(i=1;i<=n;++i)

    {

       cout<<endl;

       for(j=1;j<=n;++j)

           printf("%8d",com[i][j]);

    }

    printf("\n最优乘法次数:");

    for(i=1;i<=n;++i)

    {

       cout<<endl;

       for(j=1;j<=n;++j)

           printf("%8d",m[i][j]);

    }

    printf("\n乘法次数共计:%6d\n",m[1]
);

    printf("矩阵的结合方式:");

    combine(1,n);

    printf("\n\n");

    return 1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: