最小矩阵乘法次数

#include<stdio.h>
#include<string.h>
void printOptimalParens(int s[][100],int i,int j){
    if(i==j)printf("A%d",i);
    else{
        printf("(");
        printOptimalParens(s,i,s[i][j]);
        printOptimalParens(s,s[i][j]+1,j);
        printf(")");
    }
}
int main(){
    int t;
    scanf("%d",&t);                                                                //表示有t个矩阵相乘 
    int p[100];                                                                 //p数组是储存每个矩阵的行列 第i个矩阵的行列就是p[i-1],p[i] 
    int m[100][100];                                                            //m数组是存i和j之间的加括号的最小代价问题
    int s[100][100];
    memset(m,0,sizeof(m));
    memset(s,0,sizeof(s));
    for(int i=0;i<=t;i++){                                                        //输入并且初始化m 
        scanf("%d",&p[i]);
        if(i<=t)m[i][i]=0;
    }
    for(int l=2;l<=t;l++){
        for(int i=1;i<=t-l+1;i++){
            int j=i+l-1;
            m[i][j]=999999;
            int k;
            printf("计算矩阵%d和%d之间的最优解:",i,j);
            for(k=i;k<=j-1;k++){
                int q=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
                if(q<m[i][j]){
                    m[i][j]=q;
                    s[i][j]=k;
                }
            }
            printf("%d,%d之间最优解是%d\n",i,j,s[i][j]);
        }
    }
    /*输出m*/
    for(int i=1;i<=t;i++){
        for(int j=1;j<=t;j++){
            printf("%-6d",m[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    /*输出s*/
    for(int i=1;i<=t;i++){
        for(int j=1;j<=t;j++){
            printf("%-6d",s[i][j]);
        }
        printf("\n");
    }
    printf("\n");
    
    /*输出带括号的矩阵*/
    printf("用括号表示矩阵相乘的先后顺序是:");
    printOptimalParens(s,1,t);
    printf("\n");
    return 0;
} 

 

posted on 2012-12-16 23:29  Aquariuslt  阅读(498)  评论(0)    收藏  举报

导航