1 条题解

  • 0
    @ 2025-4-9 22:22:02

    题意分析

    这道题目要求我们实现多个矩阵的连续乘法运算。具体来说:

    给定一系列矩阵,保证相邻矩阵的维度是兼容的(前一个矩阵的列数等于后一个矩阵的行数)

    需要按照给定的顺序将这些矩阵相乘

    输出最终的结果矩阵

    输入保证所有中间结果和最终结果都在整数范围内

    解题思路

    基础解法

    这是一个标准的矩阵乘法问题,可以直接按照矩阵乘法的定义来实现:

    矩阵乘法定义:

    对于矩阵A(m×p)A(m×p)和矩阵B(p×n)B(p×n),它们的乘积C(m×n)满足: C[i][j]=Σ(A[i][k]B[k][j])C[i][j] = Σ(A[i][k] * B[k][j]),其中k从1到p

    连续乘法:

    从第一个矩阵开始,依次与后续矩阵相乘

    每次乘法的结果作为下一次乘法的第一个矩阵

    算法步骤

    读取第一个矩阵作为初始结果矩阵

    依次读取后续矩阵:

    检查维度是否兼容(前矩阵列数=后矩阵行数)

    执行矩阵乘法

    将结果存储为新的结果矩阵

    输出最终的结果矩阵

    复杂度分析

    时间复杂度:O(XMN*P),其中X是矩阵数量,M,N,P是矩阵维度

    空间复杂度:O(M*N)存储结果矩阵

    代码实现

    #include <iostream>
    #include <vector>
    using namespace std;
    
    vector<vector<int> > matrixMultiply(const vector<vector<int> >& A, 
                                      const vector<vector<int> >& B) {
        int m = A.size();
        int p = A[0].size();
        int n = B[0].size();
        
        vector<vector<int> > C(m, vector<int>(n, 0));
        
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                for (int k = 0; k < p; ++k) {
                    C[i][j] += A[i][k] * B[k][j];
                }
            }
        }
        
        return C;
    }
    
    int main() {
        int Z;
        cin >> Z;
        
        while (Z--) {
            int X;
            cin >> X;
            
            vector<vector<int> > result;
            
            for (int x = 0; x < X; ++x) {
                int M, N;
                cin >> M >> N;
                
                vector<vector<int> > matrix(M, vector<int>(N));
                for (int i = 0; i < M; ++i) {
                    for (int j = 0; j < N; ++j) {
                        cin >> matrix[i][j];
                    }
                }
                
                if (x == 0) {
                    result = matrix;
                } else {
                    result = matrixMultiply(result, matrix);
                }
            }
            
            // 改用传统for循环输出
            for (size_t i = 0; i < result.size(); ++i) {
                for (size_t j = 0; j < result[i].size(); ++j) {
                    if (j != 0) cout << " ";
                    cout << result[i][j];
                }
                cout << endl;
            }
            
            cout << endl;
        }
        
        return 0;
    }
    
    • 1

    信息

    ID
    994
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    3
    已通过
    1
    上传者