前缀和矩阵求和

前缀和

已知n*m矩阵,q次询问,每次给出子矩阵左上角和右下角坐标,求子矩阵的和。

1.暴力算法 直接朴素的多重循环累加每一元素

2.优化算法

用s(x,y)(x,y)表示面积

s(m,n)(p,q)=s(0,0)(p,q)-s(0,0)(m,q)-s(0,0)(p,n)+s(0,0)(m,n)

3.更优化算法

#include<cstdio>

#include<iostream>//可用<bits/stdc++.h>

using namespace std;//c++标准打法

long long N, M, e, query, x1, y1, x2, y2, ans, sum[2005][2005] = {0};//定义变量

int main() {

    while (cin >> N >> M) { //cin和printf函数值固定为1

        for (int i = 1; i <= N; ++i) {

            for (int j = 1; j <= M; ++j) {

                cin >> e;

                sum[i][j] = sum[i][j-1] + sum[i-1][j] - sum[i-1][j-1] + e;

            }

        }

        cin >> query;

        while (query--) { //query到零时停

            cin >> x1 >> y1 >> x2 >> y2;

            ans = sum[x2][y2] - sum[x2][y1-1] - sum[x1-1][y2] + sum[x1-1][y1-1];

            cout << ans << endl;

        }

    }

    return 0;

}
原文地址:https://www.cnblogs.com/heqizheng/p/juzhenqianzhuihe.html