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

【算法|前缀和系列No.2】牛客网 DP35 【模板】二维前缀和

个人主页:兜里有颗棉花糖
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创
收录于专栏【手撕算法系列专栏】【牛客网刷题】
🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助
🍓希望我们一起努力、成长,共同进步。
在这里插入图片描述

点击直接跳转到该题目

目录

  • 1️⃣题目描述
  • 2️⃣题目解析
  • 3️⃣解题代码

1️⃣题目描述

题目描述:
给你一个 n 行 m 列的矩阵 A ,下标从1开始。

接下来有 q 次查询,每次查询输入 4 个参数 x1 , y1 , x2 , y2

请输出以 (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和。

输入描述:
第一行包含三个整数n,m,q.

接下来n行,每行m个整数,代表矩阵的元素

接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数

注意:

  • 1 ≤ n , m ≤ 1000
  • 1 ≤ q ≤ 1 0 5 10^{5} 105
  • - 1 0 9 10^{9} 109 <= a[i][j] <= 1 0 9 10^{9} 109
  • 1 <= x1 <= x2 <= n
  • 1 <= y1 <= y2 <= m

输出描述:

输出q行,每行表示查询结果。

示例:

输入:
3 4 3
1 2 3 4
3 2 1 0
1 5 7 8
1 1 2 2
1 1 3 3
1 2 3 4

输出:
8
25
32

2️⃣题目解析

状态表示及状态转移方程:

  • dp[i][j] :表示从坐标(1,1)到坐标(i,j)中所有元素的和。
  • dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + arr[i][j] - dp[i - 1][j - 1];

最后输出结果:dp[x2][y2] - dp[x2][y1 - 1] - dp[x1 - 1][y2] + dp[x1 - 1][y1 - 1]

3️⃣解题代码

解题代码1:

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

const int N = 1e3 + 10, M = 1e3 + 10;

int main()
{
    int n , m , q;
    cin >> n >> m >> q;
    long long arr[N][M];
    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++)
        {
            cin >> arr[i][j];
            dp[i][j] = dp[i][j - 1] + arr[i][j];
        }
    }
    while(q--)
    {
        int x1,y1,x2,y2;
        long long ret = 0;
        cin >> x1 >> y1 >> x2 >> y2;
        for(int i = x1;i <= x2;i++)
        {
            ret += (dp[i][y2] - dp[i][y1 - 1]);
        }
        cout << ret << endl;
    }
           
    return 0;
}

解题代码2:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int n,m,q;
    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] + arr[i][j] - dp[i - 1][j - 1];

    // 使用前缀和矩阵
    int x1,y1,x2,y2;
    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;
}

最后就是代码通过啦!!!

在这里插入图片描述

相关文章:

  • QCustomPlot实现曲线拖拽
  • 浅谈大数据之Flink
  • python:从Excel或者CSV中读取因变量与多个自变量,用于训练机器学习回归模型,并输出预测结果
  • 管理系统搭建一般步骤(会话跟踪 路由导航守卫 响应拦截器)
  • NoVNC(Client)+TigerVNC(Server)搭建流程
  • 上位机在自动化中有何作用和优势?
  • Adobe发布Firefly 2,提升图像质量和用户体验
  • Android---Android 是如何通过 Activity 进行交互的
  • 使用解构赋值简化axios返回对象属性元素的提取
  • root赋权
  • nodejs+vue水浒鉴赏平台系统
  • linux下文件存储系统(inode/目录项/硬链接)
  • MySQLJDBC入门与SQL注入
  • 至强服务器BIOS/UEFI驱动开发笔记
  • 【MySQL】表的查询与连接
  • C# 图解教程 第5版 —— 第5章 类的基本概念
  • 智能油烟机 优化烹饪体验
  • python树状打印项目路径
  • spark读取hive表字段,区分大小写问题
  • 【计算机网络笔记】分组交换 vs 电路交换
  • 中美“第二阶段”贸易协定是否会在会谈中提出?商务部回应
  • 商务部:中方愿同各国一道加强合作,促进跨境电商健康可持续发展
  • 售卖自制外挂交易额超百万元,一男子因提供入侵计算机系统程序被抓
  • 现场|万里云端,遇见上博
  • “80后”海南琼海市长傅晟,去向公布
  • 吴清:创造条件支持优质中概股企业回归内地和香港股市