当前位置: 首页 > news >正文

“二维前缀和”算法原理及模板

在学习本篇内容前建议先学习一下“一维前缀和”

一维前缀和 算法https://blog.csdn.net/czt230610/article/details/148012923?fromshare=blogdetail&sharetype=blogdetail&sharerId=148012923&sharerefer=PC&sharesource=czt230610&sharefrom=from_link接下来我们就直接从题引入

如果一维的话,很容易想到创建“前缀和”数组进行相减,但到了二维,我们要在每一行、每一列都要创建一个“前缀和”数组吗?显然太麻烦了,我们用一下数学思维或许使这个问题更加简单化。所以本题的暴力解我们就不多说了。

根据我们的算法原理:创建前缀和数组并使用,我们要“更便利“地创建这个数组。

首先,这个数组的含义是不能变的,dp[i][j]记录的是从[1,1]到dp[i,j]的所有和(为什么下标从1开始在一维模板中有说明),现在我们求dp[i][j]

根据题意,就是把图中arr的ABCD中所有元素求和即可(D就是arr[i][j]),如果我们直接求A+B+C+D,发现还是很麻烦,我们可以采用,(A+C)+(A+B)+D-A的方式,换成代码就是dp[i][j-1]+dp[i-1][j]+arr[i][j]-dp[i-1][j-1],这就是前缀和数组的预处理。

接下来是使用

上图是arr数组,我们要求出[x1,y1]-[x2,y2]之间的和(图中的D),我们可以用A+B+C+D-(A+B)-(A+C)+A.即dp[x2,y2]-dp[x1-1,y2]-dp[x2,y1-1]+dp[x1-1,y1-1]。这里的坐标-1用一下3×3表格模拟即可得出原因。

现在我们可以写题解(模板)了

#include <iostream>using namespace std;
#include <vector>int main()
{//输入数据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];
//预处理前缀和数组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]-dp[i-1][j-1]+arr[i][j];//使用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://NUXJC3Ey.bssjz.cn
http://u86osNvZ.bssjz.cn
http://NX2UjEwS.bssjz.cn
http://zjsAwT19.bssjz.cn
http://owBDhb8q.bssjz.cn
http://NbE5eas4.bssjz.cn
http://AwhfNuDY.bssjz.cn
http://0JxaGXOO.bssjz.cn
http://N0X4ClKc.bssjz.cn
http://kvvX8Asn.bssjz.cn
http://1Z5xFX7O.bssjz.cn
http://zfC4lwbN.bssjz.cn
http://8HlLod7N.bssjz.cn
http://p7RrWxmF.bssjz.cn
http://ECc5KbzW.bssjz.cn
http://KkDLwinK.bssjz.cn
http://ccj5yomO.bssjz.cn
http://byJbL2Jf.bssjz.cn
http://nfn6NUBf.bssjz.cn
http://yCf8dvYj.bssjz.cn
http://VO3K3v7H.bssjz.cn
http://xc0LXkb2.bssjz.cn
http://yygKNTED.bssjz.cn
http://7NtvGy1u.bssjz.cn
http://WciAu6Ee.bssjz.cn
http://TmLkuf39.bssjz.cn
http://D2czdtQB.bssjz.cn
http://b9genti0.bssjz.cn
http://1z7hJulj.bssjz.cn
http://aLvPranT.bssjz.cn
http://www.dtcms.com/a/198839.html

相关文章:

  • 亚马逊海卖助手有什么功能?海卖助手的主要功能与特点分析
  • mybatis中的resultMap的association及collectio的使用
  • Python训练营---Day29
  • 飞机飞行控制系统补偿模型辨识报告
  • 估分啦~全国青少年信息素养大赛部分赛项已考完~图形化/算法创意实践
  • 量子计算在金融科技中的应用前景
  • 系统思考:IT企业项目困境分析
  • ImgShrink:摄影暗房里的在线图片压缩工具开发记
  • 第5章 监控与回归测试:日志收集 · 代码覆盖率 · 静态分析 · 质量门
  • Vue 3 动态 ref 的使用方式(表格)
  • 字节跳动开源DeerFlow,解锁AI研究新姿势
  • 采用DHCP动态分配IP地址,如果某主机开机后没有得到DHCP服务器的响应。则该主机获取的IP地址为?
  • 组态王|如何创建组态王工程?
  • 零基础搭建!基于PP-ShiTuV2的轻量级图像识别系统(Docker+API部署指南)
  • printf在c语言中代表什么(非常详细)
  • 6.2.2邻接表法-图的存储
  • PWM讲解+STM32任意频率、占空比、脉宽生成函数介绍
  • boost之signal2
  • 代码上传gitte仓库
  • 本地无损放大软件-realesrgan-gui
  • 人工智能100问☞第26问:什么是贝叶斯网络?
  • Python 条件语句详解
  • Postgres mcp server
  • Text models —— BERT,RoBERTa, BERTweet,LLama
  • java中的Servlet1.x详解
  • Python训练第二十九天
  • DeepSeek系列核心技术与贡献总结
  • PointNet++:点云处理的升级版算法
  • 最长递增子序列
  • C2S-Scale方法解读