一、题目
二、输入与输出
三、样例
四、代码
#include <stdio.h>
int a[301][301];
int s[301][301] = { 0 };
int main()
{
int n, i, j, m, k;
scanf("%d %d", &n, &m);
//完成第一步操作,输入两个整数,表示数组大小
int w, lx, ly, rx, ry;
for (i = 1; i <= n; i++)
{
for (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];
//求对应的前缀和
}
}
scanf("%d", &k);
//完成第三步操作,输入一个整数,表示查询
while (k--)
{
scanf("%d%d%d%d", &lx, &ly, &rx, &ry);
//输入需要查询的数据
lx++; ly++; rx++; ry++;
int w = s[rx][ry] - s[rx][ly - 1] - s[lx - 1][ry] + s[lx - 1][ly - 1];
//计算给定区间内的区间和
printf("%d\n", w);
}
return 0;
}
五、总结
基础知识:for循环,while循环,二维数组
基本思想:前缀和
{
Sn = a1 + a2 + ... + an;
求区间[l,r]之的和:S = Sr - S(l - 1) = al + a(l + 1) + ... + ar;
}
小编以为这道题对于二维数组的储存方式及其抽象的空间状态有一定的启发作用,值得大家反复思考!(^_−)☆
希望小伙伴们可以多多指正其中的不足,也欢迎提供更好的思路!!φ(>ω<*)