自学内容网 自学内容网

【C语言】二维前缀和/求子矩阵之和

相信你是最棒哒!!!

目录

题目描述

正确代码

总结


题目描述

输入一个 𝑛 行 𝑚 列的整数矩阵,再输入 𝑞个询问,每个询问包含四个整数 𝑥1,𝑦1,𝑥2,𝑦2,表示一个子矩阵的左上角坐标和右下角坐标。

对于每个询问输出子矩阵中所有数的和。

输入格式

第一行包含三个整数 𝑛,𝑚,𝑞

接下来 𝑛 行,每行包含 𝑚 个整数,表示整数矩阵。

接下来 𝑞 行,每行包含四个整数 𝑥1,𝑦1,𝑥2,𝑦2,表示一组询问。

输出格式

共 𝑞 行,每行输出一个询问的结果。

输入输出样例

输入 

3 4 3
1 7 2 4
3 6 2 8
2 1 2 3
1 1 2 2
2 1 3 4
1 3 3 4

输出 

17
27
21

说明/提示

【数据范围】

1≤𝑛,𝑚≤5000; 1≤𝑞≤100000, 1≤𝑥1≤𝑥2≤𝑛,1≤𝑦1≤𝑦2≤𝑚,

−10000≤矩阵内元素的值≤10000。


正确代码

注释版

#include<stdio.h> 

long long a[5010][5010], s[5010][5010]; // 定义两个全局二维数组,a用于存储原始数据,s用于存储前缀和

int main() /
{
    long long int n, m, q; // 定义三个长整型变量,分别用于存储矩阵的行数、列数和查询次数
    scanf("%lld%lld%lld", &n, &m, &q); 

    // 读取矩阵a的值
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            scanf("%lld", &a[i][j]);

    // 计算前缀和矩阵s
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j]; // 根据前缀和的定义计算s[i][j]

    while (q--) // 进行q次查询
    {
        long long int x1, x2, y1, y2; // 定义四个长整型变量,分别用于存储查询的子矩阵的左上角和右下角坐标
        scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2); // 从标准输入读取子矩阵的坐标

        // 利用前缀和矩阵s计算子矩阵的和
        long long int sum = s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1];
        printf("%lld\n", sum); // 输出子矩阵的和
    }

    return 0; // 主函数返回0,表示程序正常结束
}

简洁版

#include<stdio.h>
long long a[5010][5010], s[5010][5010];
int main()
{
long long int n, m, q;
scanf("%lld%lld%lld", &n, &m, &q);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%lld", &a[i][j]);

for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];

while (q--)
{
long long int x1, x2, y1, y2;
scanf("%lld%lld%lld%lld", &x1, &y1, &x2, &y2);
long long int sum = s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1];
printf("%lld\n", sum);
}


return 0;
}

总结

 // 根据前缀和的定义计算s[i][j]  s[i][j] = s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1] + a[i][j];

// 利用前缀和矩阵s计算子矩阵的和 sum = s[x2][y2] - s[x2][y1 - 1] - s[x1 - 1][y2] + s[x1 - 1][y1 - 1];


原文地址:https://blog.csdn.net/2401_88601421/article/details/144329620

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!