矩阵链乘法,添加括号

给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。 

Input

有N个矩阵连乘,用一行有n+1个数数组表示,表示是n个矩阵的行及第n个矩阵的列,它们之间用空格隔开. 

Output

你的输出应该有C行,即每组测试数据的输出占一行,它是计算出的矩阵最少连乘积次数,输出最优全括号结构

Sample Input

10 100 5 50

Sample Output 

7500

((A1A2)A3)

#include<stdlib.h>  
#include<stdio.h>  
#include <memory.h>  
#define N 3
int s[N+1][N+1];                  //s[i][j]中记录了对Ai...Aj进行分裂的最优的k值  
void Print_OPTIMAL_PARENS(int i,int j) //定义函数打印最优全括号的结果  
{  
    if(i==j)  
        printf("A%d",i);  
    else  
    {  
        printf("(");  
        Print_OPTIMAL_PARENS(i,s[i][j]);           //在分裂处进行递归调用  
        Print_OPTIMAL_PARENS(s[i][j]+1,j);  
        printf(")");  
    }  
}  
int main()  
{  
    int matrix[N+1];                  //matrix中记录矩阵的维数  
    int i,j,k,q;  
    int m[N+1][N+1];                  //m中记录矩阵连乘的次数  
    for(i=0;i<=N;i++)  
        scanf("%d",&matrix[i]);  
    memset(m,0,(N+1)*(N+1)*sizeof(int));  
    for(j=1;j<=N;j++)                  
        for (i=j;i>=1;i--)          //当i=j时,m[i][j]=0,                             
        {                           //当i<j时,m[i][j]=min{m[i][k]+m[k+1][j]+p(i-1)p(k)p(j)} i=<k<j                    
            if (j==i)  
                m[i][j]=0;  
            else  
            {  
                m[i][j]=600000;   
                for (k=i;k<j;k++)  
                {  
                    q=m[i][k]+m[k+1][j]+matrix[i-1]*matrix[k]*matrix[j];  
                    if (q<m[i][j])  
                    {  
                        m[i][j]=q;  
                        s[i][j]=k;  
                    }  
                }  
            }  
        }
	printf("%d\n",m[1][N]);  
	Print_OPTIMAL_PARENS(1,N);  
	return 0;  
}  


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值