文章

21

粉丝

0

获赞

19

访问

3.6k

头像
矩阵链乘法最小计算次数 题解:C++
P5318 四川大学2025年机试题
发布于2026年3月27日 16:15
阅读数 181

#include <iostream>
#include <vector>
#include <cmath>
#include <climits>
using namespace std;

vector<int> num;
vector<vector<long long>> memo; // 记忆化搜索

// 推导一下计算过程可以发现,只有相邻的矩阵才能相乘
// 那矩阵相乘其实就是对数组中间的数进行选择取出,直到将下标1到n-1的数全部取出,求最小的取出方式
// 相乘次数 = 取出数 * 所在左侧矩阵的行数 * 所在右侧矩阵的列数
// 每次的相乘后两个相邻矩阵都会合并成一个新的矩阵,矩阵行列会发生变化,因此计算并不方便
// 我们把整个流程反过来,变成往里面放入,这样相乘次数就是放入的数乘以左右两个数,计算方便

// 用记忆化搜索优化回溯
int dfs(int left, int right) { // 两个输入为左右两数的下标
	if (left >= right - 1) // 两数中间没有数
		return 0;

	long long& res = memo[left][right]; // 引用
	if (res != LLONG_MAX) return res; // 先前计算过

	// 对下标 1 到 n-1;本质上是进行枚举找到最小的情况
	for (int i = left + 1; i < right; i++) {
		long long sum = num[left] * num[i] * num[right];
		sum += dfs(left, i) + dfs(i, right);
		res = min(res, sum);
	}
	return res;
};

int main() {
	int n;
	cin >> n; // n个数组
	if (n == 1) {
		cout << 0;
		return 0;
	}
	num.resize(n + 1);
	// n+1个元素
	for ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发