初识算法 · 前缀和(1)

目录

前言:

一维数组的前缀和

题目解析

算法原理

算法编写

二维数组的前缀和

题目解析

算法原理

算法编写


前言:

​本文的主题是前缀和,通过两道题目讲解,一道是一维数组的模板,一道是二维数组的模板。
链接分别为:
【模板】前缀和_牛客题霸_牛客网
【模板】二维前缀和_牛客题霸_牛客网
题目分为三个部分讲解,一是题目解析,二是算法原理,三是算法编写,那么,话不多说,直接进行主题咯。


一维数组的前缀和

题目解析

题目看起来是较为复杂的,一共需要输入四个数,输入的n代表的是这个数组的长度,q代表的是查询的次数,l 和 r代表的是下标,输出的是数组arr[l] + …… + arr[r]。

那么这里就是有疑问的,题目描述的为什么是从a[1]到a[n]?而不是从arr[0]开始呢?

这里是为了防止边界,我们在算法原理部分介绍。

我们首先思考暴力解法,暴力解法无非就是模拟这个相加的过程,那么时间复杂度是查询次数 * (l - r + 1),所以最坏的情况就是l是1,r是n,所以时间复杂度就是q * n。

在这里,时间肯定是过不了的,因为题目要求:

所以q * n的话,时间复杂度是10^5,放在任何一道编程题都是过不去的。

那么我们的前缀和算法就闪亮登场了。

算法原理

这道题目我们使用的是前缀和数组,那么什么是前缀和呢?

前缀和数组,无非就是dp[i]代表的是从arr[0]一直加到arr[i],这个数组的使用在这里已经很接近我们使用该数组的本意了。

使用该数组为了简化我们暴力遍历数组这个过程。

那么对于l r来说,我们要求的是arr[l] + …… + arr[r],所以这个过程我们可以使用前缀和数组简化成dp[r] - dp[l - 1],那么这个过程是O(1)的,也就是整体下来时间复杂度是q的。

但是为什么索引是从1开始的呢?这是为了处理边界情况,如果我们要求的是 0 2这个区间,那么l - 1的值就是-1,对于一个数组来说肯定是访问不了-1的,所以这道题是从1开始的。

这是一个小细节。

算法编写

#include <iostream>
#include <vector>
using namespace std;int main() 
{//1.输入数据int n = 0, q = 0;cin >> n >> q;vector<int> arr(n + 1, 0);for(int i = 1;i <= n; i++) cin >> arr[i];//2.预处理前缀和数组vector<long long> dp(n + 1, 0);for(int i = 1; i <= n; i++)dp[i] = dp[i - 1] + arr[i];//3.使用前缀和数组int l = 0, r = 0;while(q--){cin >> l >> r;cout << dp[r] - dp[l - 1] << endl;}return 0;
}

但是这道题目有个坑就是,如果两个整型相加可能会导致溢出的问题,所以dp数组使用的long long类型。

这是一维数组的模板,下一道题目是二维数组的模板。


二维数组的前缀和

题目解析

题目的要求和一维数组是差不多的,但是并不是从1一直加到n的,而是一个区域:

就像这样,输入的x1 y1 x2 y2是1 1  2 2,那么要求的值就是由这几个下标组成的正方形的值。

当然了,暴力解法的话,肯定是要超时的,所以我们就不予考虑了。

题目的要求我们也是基本清楚了,并且在牛客上的时候,会提示使用lld打印,所以存在溢出的风险,第二个数组就使用long long类型了。

我们就直接介绍二维数组前缀和的算法原理了。

算法原理

对于二维数组前缀和的算法原理部分,同理,我们就需要得到i j对应的区域大小了:

我们如果直接遍历的话,就和暴力解法没有什么区别,所以我们不如拆分一下这个二维数组,对于dp[i][j]来说的话,就是从1 1的位置到i j位置,我们可以划分成四个区域,A B C D,如果单独求A B C的大小并不是很好求的,所以我们不妨变动一下式子,改成A + B + A + C + D - A。

此时A + B就是dp[i - 1][j] A + C 就是等于dp[i][j - 1],D就是arr[i][j],A就是dp[i - 1][j - 1]。

得到dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1]。

预处理前缀和数组就结束了,接下来是如何使用的问题。

给的是x1 y1 x2 y2,题目要求的值就是D。同样的,如果我们直接硬求每个区域的值,非常麻烦,所以我们不妨变化一下式子 D = A + B + C + D - (A + B) - (A + C) + A。至于为什么这样干,因为我们发现如果单独求B或者C十分麻烦,所以用来和A结合一下。

此时对于A + B + C + D,就是dp[x2][y2],对于A + C来说,就是dp[x2][y1 - 1],对于A + B来说,就是dp[x1 - 1][y2],A就是dp[x1 - 1][y1 - 1]。

使用前缀和结束了,这道题目也就结束了。

算法编写

#include <iostream>
#include <vector>
using namespace std;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[x2][y1 - 1] - dp[x1 - 1][y2] + dp[x1 - 1][y1 - 1] << endl;}return 0;
}

前缀和的模板就介绍完毕了~


感谢阅读!

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

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

相关文章

【WebGIS实例】(18)MapboxGL 绘制矢量——线、面

前言 Mapbox GL JS 版本&#xff1a;3.6.0 该博客仅供学习参考&#xff0c;如果您是计划在实际项目中实现该功能&#xff0c;也推荐您直接使用已有的功能库&#xff1a; 官方案例&#xff1a;Draw a polygon and calculate its areamapbox-gl-draw&#xff1a;mapbox/mapbox-g…

基于Django+python的酒店客房入侵检测系统设计与实现

项目运行 需要先安装Python的相关依赖&#xff1a;pymysql&#xff0c;Django3.2.8&#xff0c;pillow 使用pip install 安装 第一步&#xff1a;创建数据库 第二步&#xff1a;执行SQL语句&#xff0c;.sql文件&#xff0c;运行该文件中的SQL语句 第三步&#xff1a;修改源…

HTTPS讲解

前瞻 HTTP与HTTPS的关系 HTTPS也是一个在应用层的协议&#xff0c;是在HTTP协议基础上的一个加密解密层 明文 密文 秘钥 明文->秘钥 加密 秘钥->明文 解密 例如:明文为7 秘钥为2 7^21015&#xff1b; 5就是密文例子: 因为http的内容是明文传输的&#xff0c;明文…

危险物品图像分割系统:一键训练

危险物品图像分割系统源码&#xff06;数据集分享 [yolov8-seg-GFPN&#xff06;yolov8-seg-CSwinTransformer等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global…

LabVIEW共享变量通信故障

问题概述&#xff1a; 在LabVIEW项目中&#xff0c;使用IO服务器创建共享变量&#xff0c;并通过LabVIEW作为从站进行数据通信。通讯在最初运行时正常&#xff0c;但在经过一段时间或几个小时后&#xff0c;VI前面板出现错误输出&#xff0c;导致数据传输失败。虽然“分布式系统…

折扣影票接口对接渠道如何选择?

选择折扣影票接口对接渠道需要综合多方面因素考虑&#xff0c;以下是一些建议&#xff1a; 1.合法性和合规性&#xff1a; 确认供应商资质&#xff1a;优先选择具有相关票务经营资质的渠道。比如一些大型的在线票务平台&#xff0c;它们通常经过官方认证和监管&#xff0c;在…

[JAVAEE] 多线程的案例(二) - 阻塞队列 生产者消费者模型

目录 一. 什么是阻塞队列 二. java中的阻塞队列 三. 生产者消费者模型 3.1 生产者消费者模型与阻塞队列密不可分的关系 3.2 阻塞队列在生产者消费者模型的作用 a. 解耦合 b. 削峰填谷 四. 模拟实现阻塞队列 4.1 实现put方法 4.2 实现take方法 4.3 生产者消费者模型​…

了解C# 程序结构

本节我们将学习 C# 编程语言的结构&#xff0c;为了让大家能够对 C# 程序结构有个更好的理解&#xff0c;我们会先演示一个最小的、最简单的 C# 程序结构&#xff0c;以便作为接下来的章节的参考。 C# Hello World 实例 一个 C# 程序主要包括以下部分&#xff1a; 命名空间声明…

08 实战:色彩空间展示(本程序以视频为主)

程序效果如下: 我在这里讲解RGB和YCbCr的原理: 一、RGB颜色空间 1.1 基本概念 RGB颜色空间是一种最基础和常用的颜色表示方式,它基于人眼感知色彩的三原色原理。RGB分别代表: R(Red):红色G(Green):绿色B(Blue):蓝色通过这三种基本颜色的不同组合,可以产生人眼…

Promise、async、await 、异步生成器的错误处理方案

1、Promise.all 的错误处理 Promise.all 方法接受一个 Promise 数组&#xff0c;并返回所有解析 Promise 的结果数组&#xff1a; const promise1 Promise.resolve("one"); const promise2 Promise.resolve("two");Promise.all([promise1, promise2]).…

基于人体姿势博文文章

MATLAB运动目标检测系统应用背景 运动目标的定位跟踪&#xff0c;检测识别&#xff0c;运动分析在图像压缩、运动分析、交通检测&#xff0c;智能监控等方面有主要的应用。 首先&#xff0c;在图像压缩中&#xff0c;运动目标检测技术可以在背景区域中将前景区域提取分割出来…

91.【C语言】数据结构之单向链表的查找,中间插入和删除,销毁

目录 1.链表的查找函数 2.链表的修改函数 3.链表的中间插入函数 1.在pos之前插入:SLTInsertBefore函数 1.借助头指针pphead 示意图 代码示例(写入SList.c) 头文件添加SLTInsertbefore的声明 main.c的部分代码改为 1.测试中间插入 2.测试头部插入 3.测试pos为NULL的…

机器视觉:9点标定的原理与实现

一、什么是标定 标定就是将机器视觉处理得到的像素坐标转换成实际项目中使用到的毫米坐标。简单说即使看看实际单位距离内有几个像素&#xff0c;如下图所示&#xff0c;10mm的距离内有222个像素&#xff0c;那像素坐标和实际的毫米坐标就有个比例关系了。 二、九点标定 9点标…

API网关的作用--为什么微服务需要一个API网关?

微服务网关核心作用就是协议转换、安全隔离和流量控制 微服务架构中&#xff0c;API网关作为系统的入口点&#xff0c;可以统一处理所有客户端请求。 1&#xff09;协议转换&#xff1a;它能够支持多种通信协议&#xff08;如HTTP、gRPC等&#xff09;之间的相互转换&#xff…

如何初始化一个线上的GitHub仓库,在本地已有的仓库中上传到线上

如何初始化一个线上的GitHub仓库&#xff0c;在本地已有的仓库中上传到线上&#xff0c; 首先&#xff0c;先创建一个线上的仓库 本地有一个曾经的仓库&#xff0c;或者本地git init创建一个本地仓库 根据线上仓库的主页给的提示代码进行上传 代码如下&#xff1a; …or cr…

gateway 整合 spring security oauth2

微服务分布式认证授权方案 在分布式授权系统中&#xff0c;授权服务要独立成一个模块做统一授权&#xff0c;无论客户端是浏览器&#xff0c;app或者第三方&#xff0c;都会在授权服务中获取权限&#xff0c;并通过网关访问资源 OAuth2的四种授权模式 授权码模式 授权服务器将授…

(三)行为模式:11、模板模式(Template Pattern)(C++示例)

目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将某些步骤…

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码

故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码 目录 故障诊断 | CNN-ResNets滚动轴承故障诊断实例代码效果一览基本介绍程序设计参考资料 效果一览 基本介绍 CNN-ResNets&#xff08;卷积神经网络-残差网络&#xff09;在滚动轴承故障诊断中是一种常用的方法。这种方法利用…

Docker 实践与应用举例教程:从入门到精通

Docker 实践与应用举例教程&#xff1a;从入门到精通 引言 在现代软件开发中&#xff0c;Docker 已成为一种不可或缺的工具。它通过容器化技术简化了应用的部署、管理和扩展&#xff0c;极大地提高了开发和运维的效率。本文将详细介绍 Docker 的基本概念、安装步骤、常用命令…

arm ubuntu22.04 安装es7.16.2

1、更新软件包 sudo apt update && sudo apt upgrade -y 2、安装jdk11 sudo apt install openjdk-11-jdk -y 安装查看版本 java -version 输出应该是这样的 openjdk version "11.0.11" 2021-04-20 OpenJDK Runtime Environment (build 11.0.119-Ub…