文章
21
粉丝
0
获赞
19
访问
3.6k
#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 ...
登录后发布评论
暂无评论,来抢沙发