基础算法——子矩阵的和
发布日期:2021-05-08 12:40:42 浏览次数:23 分类:精选文章

本文共 930 字,大约阅读时间需要 3 分钟。

题目描述

输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1, y1, x2, y2,表示一个子矩阵的左上角坐标和右下角坐标。
对于每个询问输出子矩阵中所有数的和。

算法思想

计算矩阵的前缀和:s[x][y] = s[x - 1][y] + s[x][y -1] - s[x -1][y-1] + a[x][y]。通过这种方法,我们可以快速计算任意子矩阵的和。
子矩阵的和可以通过以下公式计算:s = s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]。

代码实现

#include 
using namespace std; const int N = 1010; int a[N][N], s[N][N]; int main() { int n, m, q; cin >> n >> m >> q; 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, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); printf("%d\n", s[x2][y2] - s[x1 - 1][y2] - s[x2][y1 - 1] + s[x1 - 1][y1 - 1]); } return 0; }

这个算法通过预先计算矩阵的前缀和,使得每个子矩阵的和可以在常数时间内查询。这种预处理方法的时间复杂度为O(nm),而每个查询的时间复杂度为O(1),整体复杂度为O((n + m) + q)。

上一篇:双端队列广度优先搜索
下一篇:最小生成树——Kruskal

发表评论

最新留言

很好
[***.229.124.182]2025年03月25日 19时58分11秒