社区讨论

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 条回复,欢迎继续交流。

正在加载回复...