本题是一维前缀和的扩展,这是一个二维前缀和的题目,主要还是要推导两个公式
1.求前缀和的公式,s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j]
2.利用前缀和结果s[i][j] 求取原矩阵中任意子矩阵的和的公式
3.[(x1,y1),(x2,y2)] = s[x2][y2] - s[x2][y1-1] -s[x1-1][y2] + s[x1-1][y1-1]
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n, m, q;
int a[N][N], s[N][N];
int main()
{
scanf("%d %d %d", &n, &m, &q);
//为了使用公式下班 这里要注意i,j都要从1开始,防止出现负数下标的情况
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
scanf("%d", &a[i][j]);
s[i][j] = s[i-1][j] + s[i][j-1] - s[i-1][j-1] + a[i][j];
}
}
while(q--) {
int x1, x2, y1, y2;
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
int sum = s[x2][y2] - s[x2][y1-1] - s[x1-1][y2] + s[x1-1][y1-1];
printf("%d\n", sum);
}
return 0;
}