矩阵乘法

36 篇文章 0 订阅

问题描述
  有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];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值