矩阵连乘(动态规划)
作者:
高歌猛进
,
2024-08-03 22:20:17
,
所有人可见
,
阅读 6
#include<stdio.h>
#define max 100
int r[max]; //矩阵的值
int m[max][max]; //矩阵最小乘法次数
int com[max][max]; //矩阵分割点
int couse(int n){
int x,i,j,k,t;
for(i=1;i<=n;i++){
m[i][i] = 0; //只有一个矩阵乘法运算次数
com[i][i] =0; //只有一个矩阵时分割点
}
for(x=2;x<=n;x++){ //x个矩阵连乘
for(i=1;i<=n-x+1;i++){ //i是x个矩阵连乘的起始位置
j = i+x-1; //j是终点位置
m[i][j] = m[i][i] + m[i+1][j] + r[i]*r[i+1]*r[j+1];//先以i为分割点,计算i到j的次数
com[i][j] = i;//分割点为i
for(k=i+1;k<j;k++){ //开始从i的下一个位置为分割点
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;
}
}
}
}
return m[1][n];
}
int main(){
int n;
scanf("%d",&n); //输入矩阵的总个数
for(int i=1;i<=n+1;i++) //n个矩阵,有n+1个值
scanf("%d",&r[i]);
printf("%d",couse(n)); //矩阵最小运算次数
}
/*
4
5 20 50 1 100
4
10 20 30 40 30
3
5 10 3 12
6
30 35 15 5 10 20 25
*/