首页 > 技术文章 > 12.子矩阵的和

fx1998 2020-06-28 20:12 原文

 

 二维前缀和

原数组a[i][j]

前缀和数组s[i][j]表示i,j这个点左上角所有数的和

 所以以x1,y1为左上角,x2,y2为右下角的矩阵的和等于:上式。

这是计算子矩阵的和。

然后是如何初始化前缀和数组。

 

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 1010;
 4 int a[N][N], s[N][N];
 5 int main() {
 6     int n, m, q;
 7     cin >> n >> m >> q;
 8     for (int i = 1; i <= n; i++) {
 9         for (int j = 1; j <= m; j++) {
10             cin >> a[i][j];
11             s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];
12             //求前缀和 
13         }
14     }
15     while (q--) {
16         int x1, y1, x2, y2;
17         cin >> x1 >> y1 >> x2 >> y2;
18         cout << s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1] << endl;
19         //求子矩阵的和 
20     }
21     return 0;
22 }

 

推荐阅读