动态规划——矩阵连乘问题
在计算矩阵连乘积时,加括号的方式对计算量有影响。
例如有三个矩阵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次数乘。
输入连乘矩阵的个数,每个矩阵的维数。要求输出最少数乘次数。
#include<stdio.h> void perm(int *a,int n){ int m[n][n]; for(int i=0;i<=n;i++){ m[i][i]=0; } for(int r=2;r<=n;r++){ for(int i=1;i<=n-r+1;i++){ int j=r+i-1; m[i][j]=m[i][i]+m[i+1][j]+a[i-1]*a[i]*a[j]; for(int k=i+1;k<j;k++){ int t=m[i][k]+m[k+1][j]+a[i-1]*a[k]*a[j]; if(t<m[i][j]){ m[i][j]=t; } } } } printf("%d",m[1][n-1]); } int main(){ int n; scanf("%d",&n); //这里b数组是输入的每一个矩阵的行列的,而a数组是记录不重复的矩阵的行列。 //比如,输入30 35 35 15 15 5,那么a的值为30,35,15,5这样可以简化数组,每个数组的行列就是a[n],a[n+1] int a[n+1],b[2*n]; int j=0; for(int i=0;i<2*n;i++){ scanf("%d",&b[i]); if(i%2==0){ a[j]=b[i]; j++; } } a[n]=b[2*n-1]; perm(a,n+1); }

浙公网安备 33010602011771号