矩阵连乘2
2015-10-11 17:24
344 查看
#include "stdio.h" #include "stdlib.h" #include "math.h" #include "string.h" #define N 100 int p ; //存储矩阵维数,矩阵Ai的维数为p[i-1]*p[i] int m ; //m[i][j]为最优值,即计算矩阵A[i:j]所需的最少数乘次数 int s ; //确定A[i:j]的最优次序中断开的位置k int lookupChain(int i, int j); int MemoizedMatrixChain(int n) { memset(m, 0, sizeof(m)); return lookupChain(1, n); } int lookupChain(int i, int j) //返回矩阵A[i:j]的最优乘次数 { if(m[i][j]>0) //如果m[i][j]已经计算过,直接返回 return m[i][j]; if(i==j) //如果只有一个矩阵,无需计算 return 0; int u = lookupChain(i,i) + lookupChain(i+1, j) + p[i-1]*p[i]*p[j]; //初始最优解 s[i][j] = i; int k; for(k=i+1; k<j; k++) //在A[i:j]内对不同断点进行检查 { int temp = lookupChain(i,k) + lookupChain(k+1, j) + p[i-1]*p[k]*p[j]; if(temp < u) //更新最优解 { u = temp; s[i][j] = k; } } m[i][j] = u; return m[i][j]; } int main() { int n; printf("输入矩阵个数:"); scanf("%d", &n); int i; printf("输入每个矩阵的维数:"); for(i=0; i<=n; i++) { scanf("%d", &p[i]); } int min = MemoizedMatrixChain(n); printf("最少乘次数为:%d\n", min); return 0; }
相关文章推荐