您的位置:首页 > 其它

矩阵连乘

2016-11-08 21:26 218 查看

递归:

#include<stdio.h>
#define N 6
int m

; //最小乘法次数
int RecurMatrixChain(int P[],int i,int j) {
m[i][j]= 100000;
if(i== j)
m[i][j]=0;
else {
for(int k=i; k<j; k++) {
int q=RecurMatrixChain(P,i,k)+RecurMatrixChain(P,k+1,j)+P[i]*P[k+1]*P[j+1];
if(q<m[i][j]) {
m[i][j]=q;
}
}
}
return m[i][j];
}
int main() {
int P[N+1]= {30,35,15,5,10,20,25};
for(int i=0; i<N; i++)
m[i][i]=0;
printf("%d",RecurMatrixChain(P,0,N-1));
return 0;
}

动态规划:

#include <stdio.h>
#define N 6
int m[6][6];//最优解
void matrix(int p[]) {
int i;
int j;
for(i=2; i<=6; i++)
for(j=0; j<6-i+1; j++) {
m[j][j+i-1]=1000000;
int k;
for(k=0; k<i-1; k++) {
if(m[j][j+i-1]>m[j][j+k]+m[j+k+1][j+i-1]+p[j]*p[j+k+1]*p[j+i])
{
m[j][j+i-1]=m[j][j+k]+m[j+k+1][j+i-1]+p[j]*p[j+k+1]*p[j+i];
}
}
}
}
int main() {
int p[7]= {30,35,15,5,10,20,25};
for(int i=0; i<6; i++)
m[i][i]=0;
matrix(p);
printf("%d\n",m[0][5]);
return 0;
}

备忘录:

#include <stdio.h>
#define N 6
int m

,s

;//最优解
int p[7]= {30,35,15,5,10,20,25};
int lookupChain(int i, int j) {
if(m[i][j]>0) return m[i][j];
if(i==j) return 0;
int u=lookupChain(i+1, j) + p[i-1]*p[i]*p[j];
s[i][j] = i;
for(int k=i+1; k<j; k++) {
int t = lookupChain(i,k) + lookupChain(k+1, j) + p[i-1]*p[k]*p[j];
if(t<u) {
u=t;
s[i][j] = k;
}
}
m[i][j] = u;
return u;
}
int memoizedmatrixChain(int n) {
for(int i=1; i<=n; i++)
for(int j=i; j<=n; j++)
m[i][j] = 0;
return lookupChain(1, n);
}
int main() {
for(int i=0; i<6; i++)
m[i][i]=0;
printf("%d\n",memoizedmatrixChain(N));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息