C++算法:一维/二维前缀和算法模板题

上篇文章:从 O(N) 到 O(log N):LCR 173 点名问题的五种解法与最优推导


目录

1.【模板】前缀和

理解题意

算法原理

细节问题

代码

2.【模板】二维前缀和

理解题意

算法原理

预处理前缀和矩阵

使用前缀和矩阵


1.【模板】前缀和

【模板】前缀和

理解题意

此题下标从1开始,长度为n的数组,要创建n+1的大小才能访问到n这个数

算法原理

解法一:暴力解法->一一模拟

每次遍历从头到尾的和,O(n*q)

解法二:前缀和 -> 快速求出数组中某一个连续区间的和 ,O(1) -> O(q) + O(n)

第一步:预处理出来一个前缀和数组,用dp表示

dpi:表示1,i区间所有元素的和

dpi = dpi - 1 + arri

第二步:使用前缀和数组

l , r -> dpr - dpl - 1

细节问题

为什么下标要从1开始计数?

如果从0开始,那么dpl-1 就是 dp-1了,要处理边界问题

如果从1开始,dpl-1 就是 dp0,此时,让dp0 = 0即可。

在初始化时,添加虚拟结点(辅助结点)

代码

复制代码
#include <iostream>
#include <vector>
using namespace std;

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

    // 2.预处理出一个前缀和数组
    vector<long long> dp(n+1); // 求和可能超出范围,用long long
    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;
}

2.【模板】二维前缀和

【模板】二维前缀和

理解题意

第一行输入矩阵行数n,列数m,查询次数q(也算行数)

之后的矩阵行数(n),每行输入m个整数,且共计n * m个整数

再之后的q行,每行输入四个整数,且行数<=n,列数<=m

以示例举例并画图:

算法原理

预处理前缀和矩阵

使用前缀和矩阵

复制代码
#include <iostream>
#include <vector>
using namespace std;

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] + arr[i][j] - dp[i-1][j-1];

    // 使用前缀和矩阵
    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;
    }

    return 0;
}

本章完。

相关推荐
银河技术14 分钟前
从脚本到 Operator:用 Go 构建可靠的微服务自动扩缩容控制器
开发语言·微服务·golang
GIS数据转换器2 小时前
地下空间综合管廊运营管理平台
大数据·开发语言·人工智能·经验分享·perl
草莓熊Lotso2 小时前
【C++ 基于微服务的即时通讯系统】etcd + brpc 从安装到服务注册发现全链路实战
网络·数据库·c++·redis·微服务·etcd
Wang's Blog7 小时前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友
inrichtt7 小时前
第八课时:SPI总线揭秘:四线全双工通信的奥
c语言·数据结构·stm32·单片机·嵌入式硬件
砚底藏山河8 小时前
python量化:行情数据回溯
java·开发语言·python·金融·maven
今年下半年8 小时前
AI智能体项目实战记录(02):初始化 Python 项目
开发语言·人工智能·python·fastapi
Williamtym8 小时前
PickGo Lab实践:用浏览器、Python和MCP串起机器人搬运仿真
开发语言·python·机器人
HPtiger8 小时前
数据结构——选择排序
数据结构·算法·排序算法
康实训8 小时前
老年评估仿真实训平台架构设计与老年人能力评估实训室教学落地实践
大数据·人工智能·算法·实训室·实训室建设