矩阵乘法

一曲冷凌霜 提交于 2020-02-17 16:13:25

问题描述
  有n个矩阵,大小分别为a0a1, a1a2, a2a3, …, a[n-1]a[n],现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。
  两个大小分别为p
q和q
r的矩阵相乘时的运算次数计为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];
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!