【前缀和】二维前缀和(模板题)
DP35 【模板】二维前缀和
DP35 【模板】二维前缀和
给你一个 n
行 m
列的矩阵 A
,下标从 1
开始,接下来有 q
次查询,每次查询输入 4
个参数 x1
, y1
, x2
, y2
。
请输出以 (x1, y1)
为左上角,(x2,y2)
为右下角的子矩阵的和。
输入描述:
第一行包含三个整数 n
,m
,q
。
接下来 n
行,每行 m
个整数,代表矩阵的元素
接下来 q
行,每行 4
个整数 x1
,y1
,x2
,y2
,分别代表这次查询的参数。
输出描述:
输出 q
行,每行代表一次查询的结果。
示例1:
输入:3 4 31 2 3 43 2 1 01 5 7 81 1 2 21 1 3 31 2 3 4
输出:82532
解题思路
一开始我有一个思路,虽然时间复杂度不是很好,其实就是借用了一维前缀和的思路,先开辟一个二维数组 prefix
,然后将二维数组的每一行都进行一维前缀和,接着在多次查询中就需要遍历多列去获取每行的前缀和,累加起来,得到最后的前缀和!
虽然这种做法是可以的,但其实时间复杂度没有达到最优处理!所以我们要利用二维前缀和的思想,其实就是一个简单的二维动态规划问题!
那么我们就得想办法看看建立起一个状态转移方程,如下图所示,红色区域是我们要求的元素:
此时如果我们直接从 [x1, y1]
开始求的话,那是比较麻烦的,和我们上面那个思路是差不多的,所以我们不妨这样子想:我们要求的区间,其实可以将其从 [1, 1]
到 [x2, y2]
区间分为下面四个区域:
那我们想,能不能就求