题目链接
题目:
分析:
- 求二维数组的区间和问题, 可以使用二维前缀和算法
- 注意: 下标从1开始计数
- 第一步: 预处理出来一个前缀和矩阵
dp[i][j] 表示: 从[1,1] 位置到[i,j] 位置, 这段区间里面所有元素的和
dp[i][j] 就等于A+B+C+D, A好求, 就是dp[i-1][j-1], 但BC不好求, 所以我们AB一起求,AC一起求 - 第二步: 使用前缀和矩阵
- 计算(x1,y1)(x2,y2) 之间的矩阵和, 就是红色区域的部分D
那么同理:
代码:
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
int q = in.nextInt();
int[][] arr = new int[m + 1][n + 1];
for (int i = 1; i < m + 1; i++) {
for (int j = 1; j < n + 1; j++) {
arr[i][j] = in.nextInt();
}
}
long[][] dp = new long[m + 1][n + 1];
for (int i = 1; i < m + 1; i++) {
for (int j = 1; j < n + 1; j++) {
dp[i][j] = dp[i][j-1] + dp[i-1][j] + arr[i][j] - dp[i-1][j-1];
}
}
while(q>0){
int x1 = in.nextInt();
int y1 = in.nextInt();
int x2 = in.nextInt();
int y2 = in.nextInt();
System.out.println(dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1]);
q--;
}
}
}