题目解析
算法讲解
本题的难点就在于:1. 处理数组的边界问题
因为数组的下标是从1开始的,我们设置dp表的含义也就是当前位置到[1][1]这一段区域的总和,因此我们需要将dp表的扩建和nums表的扩建容量都设置成多加一行和一列,这样两个数组的下标才可以对应
2. 填dp表
3. 寻找打印前缀和区间结果
#include <iostream>
#include<vector>
using namespace std;
int main()
{
int n, m, q;
cin >> n >> m >>q;
vector<vector<int>> nums(n+1, vector<int>(m+1));
//dp[i][j]表示当前位置到[1][1]这段区域的总和
vector<vector<long long>>dp(n+1, vector<long long>(m+1));
//填写数组
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> nums[i][j];
}
}
//填写dp数组
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
dp[i][j] = dp[i-1][j] + dp[i][j-1] + nums[i][j] - dp[i-1][j-1];
}
}
while(q--)
{
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
//打印前缀和
cout << dp[x2][y2] - dp[x1 - 1][y2] - dp[x2][y1 - 1] + dp[x1 - 1][y1 - 1] << endl;
}
}