#include<stdio.h>
#define N 100
int matr(int p[N],int n,int m[N][N],int s[N][N])
{
int i,j,t,k;
int r;
for(i=1;i<=n;i++)
{
m[i][i]=0;
}
for(r=2;r<=n;r++)
{
for(i=1;i<=n-r+1;i++)
{
j=i+r-1;
m[i][j]=m[i+1][j]+p[i-1]*p[i]*p[j];
s[i][j]=i;
for(k=i+1;k<j;k++)
{
t=m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t<m[i][j])
{
m[i][j]=t;
s[i][j]=k;
}
}
}
}
}
int main()
{
int p[N],m[N][N],s[N][N];
int n,n1,m1,i,j=2;
printf("请输入矩阵个数:");
scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("请输入第%d个矩阵行和列(n*m格式):",i);
scanf("%d*%d",&n1,&m1);
if(i==1)
{
p[0]=n1;
p[1]=m1;
}
else
{
p[j++]=m1;
}
}
printf("\n");
printf("记录矩阵维数分别为:\n");
for(i=0;i<n;i++)
printf("%d ",p[i]);
printf("\n");
matr(p,n,m,s);
printf("最优值数组为:\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%d ",m[i][j]);
}
printf("\n");
}
printf("最优断开位置数组为:\n");
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%d ",s[i][j]);
}
printf("\n");
}
printf("矩阵最小相乘次数为:%d",m[1][n]);
return 0;
}
动态规划之矩阵连乘
最新推荐文章于 2024-07-16 20:38:37 发布