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

算法题(129):二维前缀和

审题:

本题需要我们将q组矩阵的和打印出来

思路:
方法一:二维前缀和

由于本题使用暴力的模拟方法运行次数高达1e11,会超时,所以我们采用运行次数在1e6的二维前缀和来解题

第一步:前缀和的求法

x = i,y = j的二维矩阵前缀和f[i][j]就是A + B + C + a[i][j]

而为了将式子转化为表达式,我们可以将式子和前缀和联系起来:
(A+B) + (A+C)- A + a[i][j]

而A+B的面积就是x=i-1,y=j的位置的前缀和:f[i-1][j]

其他同理,于是转化为:f[i][j] = f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j]

第二步:根据矩阵的左上角坐标和右下角坐标确定矩阵和

思考方法和前面类似:

f[x2][y2] = A+B+C+answer

=> (A+B)+(A+C)-A+answer

最终推导得到:answer = f[x2][y2]+f[x1-1][y1-1]-f[x1-1][y2]-f[x2][y1-1]

解题:

#include<iostream>
using namespace std;
typedef long long ll; 
ll n,m,q;
const ll N = 1e3+10;
ll f[N][N];//前缀和数组
ll a[N][N];
int main()
{//数据录入cin >> n >> m >> q;for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){cin >> a[i][j];}}//前缀和处理for(int i = 1; i <= n; i++){for(int j = 1; j <= m; j++){f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1] + a[i][j];}}//数据处理并输出while(q--){ll x1,x2,y1,y2;cin >> x1 >> y1 >> x2 >> y2;ll answer = f[x2][y2]+f[x1-1][y1-1]-f[x1-1][y2]-f[x2][y1-1];cout << answer << endl;}return 0;
}

注意:

1.本题采取索引为1的存储方式:

其一是为了和题目给的索引对应

其二是为了避免进行边界检查,因为推导的公式中存在访问i-1或j-1的,如果从索引为0开始计算会出现越界访问-1的情况

2.本题需要采用long long 类型:因为题目中的数据范围是-1e9~1e9,这是很大的,如果进行运算很容易就超过int的存储范围

【模板】二维前缀和

相关文章:

  • RHCSA Linux 系统文件内容显示2
  • FPGA学习(五)——DDS信号发生器设计
  • 国产动漫记录
  • LangChain4j语言模型选型指南:主流模型能力全景对比
  • FreeRTOS中断管理
  • 【Agent】AI智能体评测基座AgentCLUE-General
  • python解压复制文件
  • Python多进程并发编程:深入理解Lock与Semaphore的实战应用与避坑指南
  • 【每日八股】复习 Redis Day1:Redis 的持久化(上)
  • 力扣DAY60-61 | 热100 | 回溯:单词搜索、分割回文串
  • 二、在springboot 中使用 AIService
  • 第38讲|AI + 农业病虫害预测建模
  • 2025-04-20 李沐深度学习4 —— 自动求导
  • 【Linux】清晰思路讲解:POSIX信号量、基于环形队列的生产消费模型、线程池。
  • 基于 Elasticsearch 8.12.0 集群热词实现
  • Hello, Dirty page
  • LabVIEW发电机励磁系统远程诊断
  • P8512 [Ynoi Easy Round 2021] TEST_152 Solution
  • conda环境独立管理cudatoolkit
  • vulnhub five86系列靶机合集
  • 国防部:希望美方不要有“受迫害妄想症”,总拿别人当借口
  • 吉林建筑大学党委原书记崔征接受纪律审查和监察调查
  • 杨靖︱“一笔糊涂账”:博马舍与美国革命
  • 养胃不是顿顿喝粥,这份“胃的使用说明书”请收好
  • 从“龙队”到“龙副主席”,国乒这批退役球员为何不当教练了
  • 中国围棋协会将不组队参加今年的LG杯世界棋王赛