注意:初始化矩阵下标从(0,0)开始,而计算子矩阵中元素矩阵和时满足笛卡尔坐标系,从(1,1)开始至右下角坐标,且这两个边界元素都包含!!

#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 1005; // 根据需要调整矩阵的最大尺寸
int prefixSum[MAXN][MAXN]; // 存储前缀和的数组

// 初始化前缀和数组
void initPrefixSum(const vector<vector<int>>& matrix) {
    int n = matrix.size();
    int m = matrix[0].size();

    // 初始化前缀和数组为0
    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= m; ++j) {
            prefixSum[i][j] = 0;
        }
    }

    // 计算前缀和
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= m; ++j) {
            prefixSum[i][j] = prefixSum[i - 1][j] + prefixSum[i][j - 1] - prefixSum[i - 1][j - 1] + matrix[i - 1][j - 1];
        }
    }
}

// 获取子矩阵(x1, y1)到(x2, y2)的和(下标从1开始)
int getMatrixSum(int x1, int y1, int x2, int y2) {
    return prefixSum[x2][y2] - prefixSum[x1 - 1][y2] - prefixSum[x2][y1 - 1] + prefixSum[x1 - 1][y1 - 1];
}

int main() {
    // 示例矩阵
    vector<vector<int>> matrix = {
        {1, 2, 3},
        {4, 5, 6},
        {7, 8, 9}
    };

    // 初始化前缀和
    initPrefixSum(matrix);

    // 获取子矩阵(1, 1)到(2, 2)的和
    int sum = getMatrixSum(1, 1, 2, 2);
    cout << "Sum of submatrix (1, 1) to (2, 2) is: " << sum << endl;

    return 0;
}