您的位置:首页 > 其它

矩阵连乘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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: