社区讨论
30分,求调
P1753矩阵链排序问题参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mks5tdvh
- 此快照首次捕获于
- 2026/01/24 18:21 上个月
- 此快照最后确认于
- 2026/02/11 02:30 3 周前
CPP
#include <iostream>
#include <vector>
#include <climits> // 用于 INT_MAX
using namespace std;
// 计算矩阵链乘法的最少运算次数
long long matrixChainMinCost(const vector<int>& w) {
int n = w.size() - 1; // 矩阵的数量(w的长度是n+1)
// 定义dp表:dp[i][j]表示计算M_i到M_j的最少运算次数
vector<vector<long long>> dp(n, vector<long long>(n, 0));
// 枚举矩阵链的长度,从2开始(长度为1时dp[i][i]=0)
for (int len = 2; len <= n; ++len) {
// 枚举起始位置i,j = i + len - 1 是结束位置
for (int i = 0; i <= n - len; ++i) {
int j = i + len - 1;
dp[i][j] = LLONG_MAX; // 初始化为极大值(避免int溢出,用long long)
// 枚举分割点k(i <= k < j)
for (int k = i; k < j; ++k) {
// 计算当前分割点的总运算次数
long long cost = dp[i][k] + dp[k+1][j] + (long long)w[i] * w[k+1] * w[j+1];
// 更新最小值
if (cost < dp[i][j]) {
dp[i][j] = cost;
}
}
}
}
return dp[0][n-1];
}
int main() {
int n;
// 输入矩阵数量
cin >> n;
// 输入维度数组w(长度为n+1)
vector<int> w(n + 1);
for (int i = 0; i <= n; ++i) {
cin >> w[i];
}
// 计算并输出最少运算次数
long long minCost = matrixChainMinCost(w);
cout << minCost << endl;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...