UVa 348: Optimal Array Multiplication Sequence

本文介绍了一种解决矩阵链乘问题的经典动态规划方法,并提供了详细的C++实现代码。该算法通过递归方式确定最优矩阵乘法顺序,以最小化所需的乘法次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最优矩阵链乘问题。经典dp问题。

我的解题代码如下,其中dp[i][j]表示计算从第i个矩阵到第j个矩阵的矩阵链的乘积所需的最少乘法次数,dpi[i][j]表示计算从第i到第j个矩阵乘积所做的最后一次乘法在第dpi[i][j]个矩阵之后的位置。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>

using namespace std;
#define maxn 10
const int INF = 0x7fffffff;
int Row[maxn], Col[maxn];
int dp[maxn][maxn];
int dpi[maxn][maxn];
int f(int s, int t)
{
	if(dp[s][t]!=-1) return dp[s][t];

	dpi[s][t] = s;
	if(s==t) return dp[s][t] = 0;

	int min = INF, tmp;
	for(int i=s; i<t; i++)
	{
		tmp = f(s,i)+f(i+1,t)+Row[s]*Col[i]*Col[t];
		if(min>tmp) { min = tmp; dpi[s][t] = i; }
	}
	return dp[s][t] = min;
}
void print(int s, int t)
{
	if(s>t) return;
	if(s==t) { printf("A%d",s+1); return ;}
	printf("(");
	print(s,dpi[s][t]);
	printf(" x ");
	print(dpi[s][t]+1,t);
	printf(")");
	return;
}
int main()
{
	int N, Case = 0;
	while(scanf("%d",&N) && N)
	{
		for(int i=0; i<N; i++) scanf("%d %d",&Row[i],&Col[i]);
		memset(dp,-1,sizeof(dp));
		printf("Case %d: ",++Case);
		f(0,N-1);
		print(0,N-1);
		printf("\n");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值