前缀和矩阵求和
前缀和
已知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;
}