问题描述
有n个矩阵,大小分别为a0a1, a1a2, a2a3, …, a[n-1]a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。
两个大小分别为pq和qr的矩阵相乘时的运算次数计为pqr。
输入格式
输入的第一行包含一个整数n,表示矩阵的个数。
第二行包含n+1个数,表示给定的矩阵。
输出格式
输出一个整数,表示最少的运算次数。
样例输入
3
1 10 5 20
样例输出
150
数据规模和约定
1<=n<=1000, 1<=ai<=10000。
#include <stdio.h>
#include <string.h>
#define INF (911111111111111111)
long long min(long long,long long);
long long solve(int,int,int n,long long[][2],long long[][1000+1]);
int main(void)
{
int n,i,j;
scanf("%d",&n);
long long sz[n+2][2];
for(i = 1;i <= n+1;i++)
{
scanf("%lld",&sz[i][0]);
}
for(i = 1;i <= n;i++)
{
sz[i][1] = sz[i+1][0];
}
static long long dg[1000+1][1000+1];
memset(dg,-1,sizeof(dg));
printf("%lld\n",solve(1,n,n,sz,dg));
return 0;
}
long long min(long long a,long long b)
{
return a < b ? a:b;
}
long long solve(int q,int p,int n,long long sz[][2],long long dg[][1000+1])
{
//printf("%d %d\n",q,p);
if(dg[q][p] != -1)
{
return dg[q][p];
}
if(q+1 == p)
{
return dg[q][p] = sz[q][0]*sz[q][1]*sz[p][1];
}
if(q == p)
{
return dg[q][p] = 0;
}
dg[q][p] = ;
int i;
for(i = q;i < p;i++)
{
dg[q][p] = min(dg[q][p],solve(q,i,n,sz,dg)+solve(i+1,p,n,sz,dg)+sz[q][0]*sz[i][1]*sz[p][1]);
}
return dg[q][p];
}
来源:CSDN
作者:if就
链接:https://blog.csdn.net/weixin_43191153/article/details/104358545