矩阵连乘最少次数

#include<stdio.h>

#define MAX 50

#define inf 99999999

int p[MAX+1]; //矩阵链乘:存各矩阵的行数和最后一个矩阵的列数

int m[MAX][MAX]; //总矩阵

int s[MAX][MAX]; //存储分割点

int n; //输入矩阵的个数

void matrix(){

int i,j,k; //i是分割子矩阵的长度,j是子矩阵首段,k是分割点

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

m[i][i]=0; //当最小子问题仅含一个矩阵时,无需操作,故总矩阵对角线清零

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

for(j=0;j<n-i+1;j++){ //n+1-i最大只能从比总矩阵链长少1的地方开始分

m[j][j+i-1]=inf; //j+i-1子矩阵首段+子矩阵长度即为子矩阵末端

for(k=0;k<i-1;k++){

if(m[j][j+i-1]>m[j][j+k]+m[j+k+1][j+i-1]+p[j]*p[j+k+1]*p[j+i]){

m[j][j+i-1]=m[j][j+k]+m[j+k+1][j+i-1]+p[j]*p[j+k+1]*p[j+i];

s[j][j+i-1]=k;//记录分割点

}

}

}

}

 

void printmatrix(int leftindex,int rightindex){//递归打印输出矩阵链表

if(leftindex==rightindex)

printf("A%d",leftindex);

else{

printf("(");

printmatrix(leftindex,leftindex+s[leftindex][rightindex]);

printmatrix(leftindex+s[leftindex][rightindex]+1,rightindex);

printf(")");

}

}

int main(){

int i;

printf("请输入相乘矩阵的个数:");

scanf("%d",&n);

printf("请依次输入每个矩阵的行和最后一个矩阵的列:\n");

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

scanf("%d",&p[i]);

}

matrix();

printf("矩阵连乘最小次数\t%d\n",m[0][n-1]);

printmatrix(0,n-1);

printf("\n");

return 0;

}

最后实现的结果是

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值