首页 > 编程语言 >算法:前缀和算法模版

算法:前缀和算法模版

时间:2024-10-08 22:51:16浏览次数:7  
标签:前缀 int 模版 算法 vector y1 y2 dp

一维前缀和

题目

链接:一维前缀和模版题

在这里插入图片描述


思路分析

一:暴力O(q * N)
对于每一次询问,我们都可以用一个循环计算[l,r]区间内的元素和,
时间复杂度,O(q * N)

每一次计算一个区间都需要去循环一次,这是不是非常的麻烦呢?
我们能不能想一个办法把这个某个区间的和给存起来呢?进行反复利用呢?

所以,就优化出了,前缀和算法

二:前缀和O(q + N)

我们可以预处理出一个dp数组,来存放[1,i]的区间的元素和

当我们需要求区间[l,r]的元素和的时候,就可以用dp[r] - dp[l - 1]
这样每次查询的时候,时间复杂度就是O(1)

那么我们怎么去预处理出这个dp数组呢?
我们可以用递推的思想,前n个元素的和等于前n-1个元素的和加上第n个元素的和
所以,dp[i[ = dp[i - 1] + arr[i]

细节:
这里的下标是从1,开始,如果从0开始需要对dp[0]特殊处理一下。


代码

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int n ,q;
    cin >> n >> q;

    vector<int> a(n+1);
    vector<long long> dp(n+1);

    for(int i = 1;i < n + 1;i++)
    {
        cin >> a[i];
        dp[i] = dp[i-1] + a[i]; 
    }

    while(q--)
    {
        int l,r;
        cin >> l >> r;
        cout << dp[r] - dp[l-1] << endl;
    }

    return 0;
}
// 64 位输出请用 printf("%lld")

二维前缀和

题目

链接:二维前缀和模版题

在这里插入图片描述


思路分析

暴力的时间复杂度是O(q * n2),很容易想,就不多叙述了。
直接讲一下二维前缀和算法的思路。

二维前缀和与一维前缀和类似,都是采用拼接的思路。
我们先预处理出来一个dp数组,用来存放从[1,1]到[i,j]这个矩阵内的元素和。

在这里插入图片描述
来,我们抽象出来一个矩阵,从[1,1]到[i,j]

如何去求这个区间的和呢?
很明显A + B + C + D对吧
但是B 和 C都不好求啊,
诶嘿,来,试试小学几何题常用的割补法。
我们可以将A+B看成一个整体,将A+C看成一个整体
那么A+B+C+D = (A+B)+(A+C)- A + D
具象到代码就是
dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + arr[i][j]

好,预处理完dp数组后,我们如何去使用dp数组去求任意一个矩阵的元素和呢?

假设我们就需要求D区间的元素和(假设左上顶点是x1,y1,右下顶点是x2,y2)
很容易想到的是,(A+B+C+D) - (A+B+C)
但是,和之前一样,B和C区间处理不了,依然采用割补法。
D = (A+B+C+D) - (A+B) - (A+C) + A
具象到代码就是
answer = dp[x2][y2] - dp[x1-1][y2] - dp[x2][y1-1] + dp[x1-1][y1-1]

此时的时间复杂度是O(N2 + q)

细节:下标也是从1开始,dp数组多开一个空间,开到n+1,m+1
如果下标是从0开始,需要对边界情况进行特殊处理


代码

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

int main() {
    int n,m,q;
    cin >>n >> m>> q;
    vector<vector<int>> a(n+1,vector<int>(m+1));
    vector<vector<long long>> dp(n+1,vector<long long>(m+1));

    for(int i = 1;i<n+1;++i)
    {
        for(int j = 1;j< m+1;++j)
        {
            cin >> a[i][j];
            dp[i][j] = dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + a[i][j];
        }
    }

    while(q--)
    {
        int x1,y1,x2,y2;
        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;
}

国庆节结束了,我又回来啦,hhh,
继续更新!!!

标签:前缀,int,模版,算法,vector,y1,y2,dp
From: https://blog.csdn.net/2303_78940834/article/details/142770333

相关文章

  • <免费开题>基于Python二维码生成算法研究和实现|全套源码+文章lw+毕业设计+课程设计+数
    <免费开题>基于Python二维码生成算法研究和实现|全套源码+文章lw+毕业设计+课程设计+数据库+ppt摘要随着网络应用技术的普及和发展,计算机以及移动应用系统正在飞速的发展,通过互联网平台和移动端的应用技术帮助实现了智能化及数字化的管理模式,借助系统平台实现了高效便捷的管......
  • 算法day1
    https://leetcode.cn/problems/evaluate-reverse-polish-notation/为什么string&要加&:在string&token=tokens[i];中,&表示传递的是引用(reference),而不是值。这样做的好处是避免创建token的副本,从而提高效率,特别是在处理像string这种占用较大内存的对象时。传引......
  • 【数据结构与算法】线性表
    文章目录一.什么是线性表?二.线性表如何存储?三.线性表的类型我们知道从应用中抽象出共性的逻辑结构和基本操作就是抽象数据类型,然后实现其存储结构和基本操作。下面我们依然按这个思路来认识线性表一.什么是线性表?定义线性表(LinearList)是由n(n>=0)个具有相同特性......
  • 基于稀疏CoSaMP算法的大规模MIMO信道估计matlab性能仿真,对比LS,OMP,MOMP,CoSaMP
    1.算法仿真效果matlab2022a仿真结果如下(完整代码运行后无水印):     2.算法涉及理论知识概要      大规模MIMO技术通过增加天线数量来显著提升无线通信系统的性能。然而,随着天线数量的增长,信道状态信息(CSI)的准确获取变得越来越具有挑战性。传统的信道估计方法......
  • 【图论】迪杰特斯拉算法
    文章目录迪杰特斯拉算法主要特点基本思想算法步骤示例实现迪杰斯特拉算法基本步骤算法思路总结迪杰特斯拉算法迪杰特斯拉算法是由荷兰计算机科学家艾兹赫尔·迪杰特斯拉(EdsgerW.Dijkstra)在1956年提出的,用于解决单源最短路径问题的经典算法。该算法的目标是从一......
  • 【机器学习】线性回归算法简介 及 数学实现方法
    线性回归简介利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。数学公式:ℎ_(w)=w_1x_1+w_2x_2+w_3x_3+…+b=w^Tx+b概念​利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进......
  • 代码随想录算法训练营day9|●151.翻转字符串里的单词 ●卡码网:55.右旋转字符串 ●28.
    学习资料:https://programmercarl.com/0151.翻转字符串里的单词.html学习记录:151.翻转字符串里的单词(感觉C语言能考虑巧妙解法,而python直接搞就对了)c语言:把字符串整体反转,再用双指针法(slow,fast)依次翻转每一个单词,关键在于如何移除多余空格,用slow指针找到要替换到的位置,用fast......
  • 代码随想录算法训练营 | 62.不同路径,63. 不同路径 II
    62.不同路径题目链接:62.不同路径文档讲解︰代码随想录(programmercarl.com)视频讲解︰不同路径日期:2024-10-08想法:第一行第一列只有一种方法,除此之外的各自的方法数由其左和上的格子的和得到。Java代码如下:classSolution{publicintuniquePaths(intm,intn){......
  • 基于MUSIC算法的六阵元圆阵DOA估计matlab仿真
    1.程序功能描述基于MUSIC算法的六阵元圆阵DOA估计matlab仿真.2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序%MUSIC谱矩阵Pmusic=zeros(90/steps+1,360/steps);fortheta=0:steps:90forphi=0:steps:360-steps%计算时......
  • 探索优化的艺术:深入理解模拟退火算法
    探索优化的艺术:深入理解模拟退火算法在解决复杂优化问题的过程中,选择合适的算法至关重要。模拟退火算法(SimulatedAnnealing,SA)作为一种基于概率的启发式搜索方法,因其在处理大规模和复杂优化问题时表现出的卓越能力,近年来受到了广泛关注。本文将带您深入了解模拟退火算法的原理、......