动态规划之矩阵链乘法

本文深入探讨了动态规划在解决矩阵链乘法问题中的应用,详细阐述了矩阵链的最优乘法顺序,通过实例解析算法步骤,旨在帮助读者理解如何降低计算复杂度,提升效率。
摘要由CSDN通过智能技术生成



#include <iostream>
#include <vector>
#define MAXVALUE 100000;
using namespace std;


void matrix_chain_order(vector<int>p,vector<vector<int>>&m,vector<vector<int>>&s)
{
	int i, j, k, t;
	int N = p.size() - 1;
	for (i = 0; i <= N; ++i)
		m[i][i] = 0;
	for (t = 2; t <= N; t++)  //当前链乘矩阵的长度
	{
		for (i = 1; i <= N - t + 1; i++)  //从第一矩阵开始算起,计算长度为t的最少代价
		{
			j = i + t - 1;//长度为t时候的最后一个元素
			m[i][j] = MAXVALUE;  //初始化为最大代价
			for (k = i; k <= j - 1; k++)   //寻找最优的k值,使得分成两部分k在i与j-1之间
			{
				int temp = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
				if (temp < m[i][j])
				{
					m[i][j] = temp;   //记录下当前的最小代价
					s[i][j] = k;      //记录当前的括号位置,即矩阵的编号
				}
			}
		}
	}
}

//s中存放着括号当前的位置
void print_optimal_parents(vector<vector<int>>&s, int i, int j)
{
	if (i == j)
		cout << "A" << i;
	else
	{
		cout << "(";
		print_optimal_parents(s, i, s[i][j]);
		print_optimal_parents(s, s[i][j] + 1, j);
		cout << ")";
	}

}

int main()
{
	int P[7] = { 30, 35, 15, 5, 10, 20, 25 };
	vector<int>p(P, P + 7);
	
	vector<int>tmp(p.size(), 0);
	vector<vector<int>>m(p.size(), tmp);
	vector<vector<int>>s(p.size(), tmp);

	int i, j;
	matrix_chain_order(p, m, s);
	cout << "m value is: " << endl;
	for (i = 1; i <= 6; ++i)
	{
		for (j = 1; j <= 6; ++j)
			cout << m[i][j] << " ";
		cout << endl;
	}
	cout << "s value is: " << endl;
	for (i = 1; i <= 6; ++i)
	{
		for (j = 1; j <= 6; ++j)
			cout << s[i][j] << " ";
		cout << endl;
	}
	cout << "The result is:" << endl;
	print_optimal_parents(s, 1, 6);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值