前缀和2️⃣-二维前缀和

news2024/9/30 7:19:12

题目链接:**【模板】二维前缀和_牛客题霸_牛客网**

题目描述:

解法:

算法思路:

类比于一维数组的形式,如果我们能处理出来从[0, 0] 位置到 [i, j] 位置这片区域内所有元素的累加和,就可以在O(1) 的时间内,搞定矩阵内任意区域内所有元素的累加和。因此我们接下来仅需完成两步即可:

◦ 第一步:搞出来前缀和矩阵

这里就要用到一维数组里面的拓展知识,我们要在矩阵的最上面和最左边添加上一行和一列0,这样我们就可以省去非常多的边界条件的处理处理后的矩阵就像这样:

 

这样,我们填写前缀和矩阵数组的时候,下标直接从1开始,能大胆使用i - 1 ,j - 1 位置的值。

注意 dp 表与原数组 matrix 内的元素的映射关系:

从dp 表到 matrix 矩阵,横纵坐标减一;

从matrix 矩阵到 dp 表,横纵坐标加一。

前缀和矩阵中 sum[i] [j]的含义,以及如何递推二维前缀和方程

◉ sum[i] [j]的含义:

sum[i] [j] 表示,从下图的红色区域:[0, 0] 位置到 [i, j] 位置这段区域内,所有元素的累加和。对应下图的红色区域:

递推方程:其实这个递推方程非常像我们小学做过求图形面积的题,我们可以将 [0, 0] 位置到 [i, j]位置这段区域分解成下面的部分: 

sum[i] [j] = 红 + 蓝 + 绿 + 黄,分析一下这四块区域:

✸ 黄色部分最简单,它就是数组中的 matrix[i ] [j ] (注意坐标的映射关系)

✸ 单独的蓝不好求,因为它不是我们定义的状态表示中的区域,同理,单独的绿也是;

✸ 但是如果是红 + 蓝,正好是我们dp 数组中 sum[i - 1] [j] 的值,美滋滋;

✸ 同理,如果是红 + 绿,正好是我们dp 数组中 sum[i] [j - 1] 的值;

✸ 如果把上面求的三个值加起来,那就是黄 + 红 + 蓝 + 红 + 绿,发现多算了一部分红的面积,因此再单独减去红的面积即可;

✸ 红的面积正好也是符合 dp 数组的定义的,即 sum[i - 1] [j - 1]

综上所述,我们的递推方程就是:

sum[i][j]=sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j -1]+matrix[i][j]

 ◦ 第二步:使用前缀和矩阵

求[x1,y1]~[x2,y2]内值的和

为A+B+C+D - (A+B) - (A+C) + A

D = dp[x2] [y2] - dp[x1-1] [y2] - dp[x2] [y1-1] +dp[x1-1] [y1-1]

 C++算法代码:

#include <iostream>
using namespace std;
#include <vector>

int main() {
    //1.读入数据
    int n = 0, m = 0, q = 0;
    cin >> n >> m >> q;
    vector<vector<int>> arr(n+1, vector<int>(m+1));
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
            cin >> arr[i][j];

    //2.预处理前缀和矩阵
    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++)
            dp[i][j] =  dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1];
    
    //3.使用前缀和矩阵
    int x1 = 0, y1 = 0, x2 = 0, y2 = 0;
    while(q--){
        cin >> x1 >> y1 >> x2 >> y2;
        cout << dp[x2] [y2] - dp[x1-1] [y2] - dp[x2] [y1-1] +dp[x1-1] [y1-1] << endl;
    }

}
// 64 位输出请用 printf("%lld")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2087763.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

BioEdit 序列比对编辑器

软件介绍 BioEdit是一个功能齐全免费的分子生物学应用软件&#xff0c;可以完成核苷酸序列和蛋白质序列进行所有常规的分析操作。 如&#xff1a;序列比对、序列检索、引物设计、系统发育分析等。与DNAMAN 相比&#xff0c;其分析内容相对更丰富一些&#xff0c;而且提供了很…

一种基于YOLOv10的高精度光伏板缺陷检测算法(原创自研),适用缺陷检测场景、小缺陷场景

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文原创自研算法&#xff1a;一种基于YOLOv10的高精度光伏板缺陷检测算法&#xff0c;魔改SPPF_attention一种新颖的基于内容引导注意力(CGA)的混合融合&#xff0c;mAP50从原始的0.838提升至0.868 &#x1f4a1;&#x1f4a1;&…

3D Tiles的4x4的仿射变换矩阵

前言 项目需要&#xff0c;使用Cesium技术&#xff0c;把STL格式模型加载进去。 一、格式转换 第一步&#xff0c;先将STL文件转换为glTF格式 第二步&#xff0c;将glTF文件转换为3D Tiles格式&#xff0c;使用Cesium ion 二、矩阵整体结构 这个矩阵是一个4x4的仿射变换矩阵&…

探索多模态人工智能:融合视觉、语言与声音的未来智能系统

前言 在这个信息爆炸的时代&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到我们生活的每一个角落&#xff0c;从智能手机的语音助手到自动驾驶汽车&#xff0c;再到医疗诊断和个性化推荐系统。然而&#xff0c;随着技术的进步&#xff0c;我们对智能系统的要求也在不…

[LLM][Prompt Engineering]:大语言模型上下文学习-What、How、Why?

上下文学习 上下文学习什么是上下文学习2. 示例的选择2.1 相关度排序2.2 集合多样性2.3 大语言模型 3. 示例格式3.1 人工标注3.2 利用大语言模型自动生成 4. 示例顺序5. 上下文学习为什么可以work5.1 能力来源5.2 ICL的能力 Reference 在GPT-3的论文中&#xff0c;OpenAI 研究团…

深度学习示例1-全零通道的 MNIST 数据训练模型

一、代码示例 from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.datasets import mnist import numpy as np(train_images, train_labels), _ = mnist.load_data() train_images = train_images.reshape((60000, 28 * 28)) train_ima…

基于FPGA的OV5640摄像头图像采集

1.OV5640简介 OV5640是OV&#xff08;OmniVision&#xff09;公司推出的一款CMOS图像传感器&#xff0c;实际感光阵列为&#xff1a;2592 x 1944&#xff08;即500w像素&#xff09;&#xff0c;该传感器内部集成了图像出炉的电路&#xff0c;包括自动曝光控制&#xff08;AEC…

基于深度学习的单目标跟踪系统

基于深度学习的单目标跟踪&#xff0c;效果吊打传统算法&#xff0c;3060显卡上达到实时&#xff0c;代码python和c两个版本都有。 基于深度学习的单目标跟踪系统是一种先进的计算机视觉技术&#xff0c;它可以实现实时的、高精度的目标跟踪。与传统的基于特征匹配或模板匹配的…

实现A-Z滑动检索菜单

写个这小玩意真麻烦 <template><div id"letterPeo"><!-- <button click"getasd">获取</button>--><div class"letter"><div v-for"(item, index) in letter" :key"index" clas…

高速接口IO片上SSN分析方法

Gbps信号在当今的高速IO设计中非常常见。由于封装和板上的寄生电感&#xff0c;高速信号在高频下汲取电流&#xff0c;导致大的电源尖峰或骤降。像DDR5这样的并行总线接口有20多个高速IO一起切换&#xff0c;导致同时切换噪声&#xff08;SSN&#xff09;。SSN的不期望的产物是…

苹果手机怎么恢复微信聊天记录?原来这4个方法这么好用

苹果手机的微信聊天记录不见了怎么办&#xff1f;想要解决这个问题&#xff0c;可以先了解一下导致聊天记录消失的原因有哪些。 误触手机&#xff1a;我们有时误触到某个按钮&#xff0c;也可能恢复导致聊天记录消失。卸载微信&#xff1a;卸载微信后&#xff0c;重新安装再打…

国密起步5:GmSSL3交叉编译arm64

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 之前已经建立好了交叉编译环境…

让 Jenkins 到极狐GitLab 的迁移变得更加简单

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;可以私有化部署&#xff0c;对中文的支持非常友好&#xff0c;是专为中国程序员和企业推出的企业级一体化 DevOps 平台&#xff0c;一键就能安装成功。安装详情可以查看官网指南。 文章原文可以点击极狐GitLab 官方资源中心查…

利用短信群发平台时提升短信营销打开率的关键因素

尽管众多企业依赖短信群发平台作为营销手段&#xff0c;但短信的实际打开率往往不尽如人意。以下是几个显著影响短信营销效果的关键因素及其优化策略&#xff1a; 1. 谨慎选择用词&#xff0c;规避敏感词汇 现代智能手机普遍配备了智能拦截功能&#xff0c;对包含特定敏感词汇…

C++宏展开

感觉自己一直对C的宏展开没有细致地研究过&#xff0c;这两天深入地学习了一下&#xff0c;做个笔记。 文章目录 宏展开基本规则宏嵌套展开补充说明参考资料 首先明确宏展开&#xff0c;是在预处理阶段进行的&#xff0c;进入编译期就是宏展开之后的代码了&#xff0c;所以不会…

基于Flask的新冠疫情信息可视化查询系统【案例模板】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主每文一语 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主 本项目是一个案例学习项目&#xff0c;可以作为新手进行学习系统的框架&#xff0c;本项目有数据库…

Git 学习

一、基本使用 1. 基本理论 Git 是一个免费的、开源的分布式版本控制系统&#xff0c;可以快速高效地处理从小型到大型的项目&#xff1b;版本控制是一种记录一个或者若干个文件内容变化&#xff0c;以便来查阅特定版本修订情况的系统 集中化版本控制系统&#xff1a;SVN, CV…

单片机使用cJSON的坑

文章目录 问题解决办法方法一方法二 问题 单片机USAR串口通信我想用json&#xff0c; 我不想用 分隔符的方式。感觉性能够&#xff0c;还有就是方便理解。 mcu型号 : AT32F415系列 雅特力的。 cJSON库: https://github.com/DaveGamble/cJSON/tree/master 只要把 cJSON.h 和 c…

云计算实训39——Harbor仓库的使用、Docker-compose的编排、YAML文件

一、Harbor部署 1.验证python版本 [rootdocker2 ~]#python --version 2.安装pip [rootdocker2 ~]# yum -y install python2-pip #由于版本过低&#xff0c;需要对其进行一个升级 #更新pip [rootdocker2 ~]#pip install --upgrade pip 3.指定版本号 [rootdocker2 ~]# p…

geodatatool(地图资源工具)下载高德数据及数据共享

利用geodatatool&#xff08;地图资源工具&#xff09;3.8&#xff08;新&#xff09;下载高德POI数据&#xff1a; 选择类型如下&#xff1a; 数据效果如下&#xff0c;由于用的免费的key&#xff0c;所以可能数据下载还不完全&#xff0c;但已经很多了&#xff1a; 下载数据…