记住两个矩阵相乘次数的计算方法 (虽然我自己不是很理解 但是时间紧急先记住 把算法理清)
这里看不明白的可以看下面的演算过程 X并不代表通常数字计算的那种意义
#include<iostream>
using namespace std;
int main()
{
int n,r[100];//矩阵个数 矩阵大小 r1 r2 r3 …rn r(n+1)
int m[100][100],com[100][100];
int i,j,t;//for循环变量
printf("How many matrixes:");
scanf("%d",&n);
printf("How size every matrixe:");
for(i=1;i<=n+1;i++)
scanf("%d",&r[i]);
//初始化数组com和m
for (i=1;i<=n;i++){
for (j=1;j<=n;j++)
com[i][j]=0;}
for (i=1;i<n;i++){
//因为需要保证i+1<=n 所以i<n
m[i][i]=0; //m(i)(i)=0
m[i][i+1]= r[i]*r[i+1]*r[i+2]; // m(i)(i+1)
com[i][i+1] = i;//
}
m[n][n]= 0;//情况补足
//动态规划过程 j-i>=2时 例如m13
for ( int s =2; s<=n-1; s++){
//i+s<=n min(i)=1 s<=n-1
for (i=1;i<n-s+1;i++){
//mij i的范围 <=n+1-s
j=i+s;//mij j=i+s
m[i][j] =m[i][i] +m[i+1][j] + r[i]*r[i+1]*r[j+1]; //通式代入 k=i时
com[i][j] = i;//记录最小次数时的k值
for (int k=i+1;k<j;k++){
//k<j 若为j则出现 r[i]*r[j+1]*r[j+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;//记录此时的k值情况
}
}
}
}
printf("The least calculate quantity:%d",m[1][n]);//最终所要求的结果
for (i=1;i<=n;i++){
printf("\n");
for (j=1;j<=n;j++)
printf("%d",com[i][j]);//输出k值记录矩阵
}
}