基础算法-子矩阵的和

这篇具有很好参考价值的文章主要介绍了基础算法-子矩阵的和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 课堂笔记 

基础算法-子矩阵的和,# 算法基础,算法

基础算法-子矩阵的和,# 算法基础,算法

基础算法-子矩阵的和,# 算法基础,算法

 基础算法-子矩阵的和,# 算法基础,算法

  基础算法-子矩阵的和,# 算法基础,算法

2 详解

二维前缀和推导

如图:

基础算法-子矩阵的和,# 算法基础,算法

紫色面积是指(1,1)左上角到(i,j-1)右下角的矩形面积, 绿色面积是指(1,1)左上角到(i-1, j )右下角的矩形面积。每一个颜色的矩形面积都代表了它所包围元素的和。
基础算法-子矩阵的和,# 算法基础,算法
从图中我们很容易看出,整个外围蓝色矩形面积s[i][j] = 绿色面积s[i-1][j] + 紫色面积s[i][j-1] - 重复加的红色的面积s[i-1][j-1]+小方块的面积a[i][j];

因此得出二维前缀和预处理公式

s[i] [j] = s[i-1][j] + s[i][j-1 ] + a[i] [j] - s[i-1][ j-1]

接下来回归问题去求以(x1,y1)为左上角和以(x2,y2)为右下角的矩阵的元素的和。

如图:
基础算法-子矩阵的和,# 算法基础,算法

紫色面积是指 ( 1,1 )左上角到(x1-1,y2)右下角的矩形面积 ,黄色面积是指(1,1)左上角到(x2,y1-1)右下角的矩形面积;

不难推出:
基础算法-子矩阵的和,# 算法基础,算法

绿色矩形的面积 = 整个外围面积s[x2, y2] - 黄色面积s[x2, y1 - 1] - 紫色面积s[x1 - 1, y2] + 重复减去的红色面积 s[x1 - 1, y1 - 1]

因此二维前缀和的结论为:

以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:
s[x2, y2] - s[x1 - 1, y2] - s[x2, y1 - 1] + s[x1 - 1, y1 - 1]

总结:

20201217174751639.png
前缀和与差分的个人心得总结

代码:

#include <iostream>

using namespace std;

const int N = 1010;

int n, m, q;
int s[N][N];

int main()
{
    scanf("%d%d%d", &n, &m, &q);

    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
            scanf("%d", &s[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];

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

    return 0;
}

 2 代码

基础算法-子矩阵的和,# 算法基础,算法

3.代码解析 

#include<iostream>
using namespace std;
const int maxn=1010;
int a[maxn][maxn],s[maxn][maxn];
int n,m,q,x1,y1,x2,y2;

int main(){
    scanf("%d%d%d",&n,&m,&q);
    //为数组赋值
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            scanf("%d",&a[i][j]);
        }
    }
    //为前缀和赋值
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            s[i][j] = s[i][j-1] + s[i-1][j] - s[i-1][j-1] +a[i][j];
        }
    }
    //输出结果
    while(q--){
        scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
        printf("%d\n",s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]);
    }
}

参考文献

作者:林小鹿
链接:https://www.acwing.com/solution/content/27301/
来源:AcWing
 文章来源地址https://www.toymoban.com/news/detail-615309.html

到了这里,关于基础算法-子矩阵的和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 求两个3×4矩阵的和

    答案代码

    2024年02月04日
    浏览(33)
  • 796.子矩阵的和(acwing)

    输入一个 n 行 m 列的整数矩阵,再输入 q 个询问,每个询问包含四个整数 x1,y1,x2,y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数 n,m,q。 接下来 n 行,每行包含 m 个整数,表示整数矩阵。 接下来 q 行

    2024年04月16日
    浏览(40)
  • 2023-8-14 子矩阵的和

    题目链接:子矩阵的和

    2024年02月12日
    浏览(31)
  • 17、子矩阵的和(含源码)

    题目描述 输入一个n行m列的整数矩阵,再输入q个询问,每个询问包含四个整数x1, y1, x2, y2,表示一个子矩阵的左上角坐标和右下角坐标。 对于每个询问输出子矩阵中所有数的和。 输入格式 第一行包含三个整数n,m,q。 接下来n行,每行包含m个整数,表示整数矩阵。 接下来

    2024年04月12日
    浏览(30)
  • LeetCode——查询后矩阵的和

    目录 1、题目 2、题目解读 3、代码 2718. 查询后矩阵的和 - 力扣(Leetcode) 给你一个整数  n  和一个下标从  0  开始的  二维数组   queries  ,其中  queries[i] = [typei, indexi, vali]  。 一开始,给你一个下标从  0  开始的  n x n  矩阵,所有元素均为  0  。每一个查询,你需要

    2024年02月09日
    浏览(28)
  • LeetCode 2679. 矩阵中的和

    力扣题目链接:https://leetcode.cn/problems/sum-in-a-matrix/ 给你一个下标从 0  开始的二维整数数组  nums  。一开始你的分数为  0  。你需要执行以下操作直到矩阵变为空: 矩阵中每一行选取最大的一个数,并删除它。如果一行中有多个最大的数,选择任意一个并删除。 在步骤 1

    2024年02月12日
    浏览(35)
  • 矩阵对角线元素的和

    题目: 给你一个正方形矩阵 mat ,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例: 输入:mat = [[1,2,3],             [4,5,6],             [7,8,9]] 输出:25 解释:对角线的和为:1 + 5 + 9 + 3 + 7 = 25 请注意

    2024年02月15日
    浏览(53)
  • 子矩阵的和(二维前缀和)

    上一篇文章介绍了一维前缀和,也就是一个数组的前 n 项和,这篇文章来介绍一下什么是二维前缀和。 含义 一维的是前 n 项的和,那么二维的情况下,表示的则是与左上角形成的矩形和。 怎么求 一维的递推关系式是 s[i] = s[i - 1] + a[i]; ,我们根据含义来思考二维的递推关系

    2024年02月08日
    浏览(40)
  • 796. 子矩阵的和(二维前缀和)

    796. 子矩阵的和 - AcWing题库   1.暴力搜索(搜索时间复杂度为O(n2),很多时候会超时) 2. 前缀和(左上角(二维)前缀和):本题特殊在不是直接求前n个数的和,而是求矩阵中某个元素左上角所以数的和(包括该元素自己),利用左上角前缀和的运算求子矩阵和。 3.在求左上

    2024年02月06日
    浏览(35)
  • 【1572. 矩阵对角线元素的和】

    来源:力扣(LeetCode) 描述: 给你一个正方形矩阵 mat ,请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1: 示例 2: 示例 3: 提示: n == mat.length == mat[i].length 1 = n = 100 1 = mat[i][j] = 100 方法一:遍历矩阵 思路

    2024年02月12日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包