算法学习笔记(2)-前缀和

news2024/11/18 20:17:02

##前缀和

指的是某序列的前n项和,在数学上我们可以理解称为数列的前n项和。前缀和是一种预处理,用于降低查询的时间复杂度。

##一维前缀和

有一个一维数组x和该数组的前缀和数组y,则x和y具有以下关系:

#python代码示例

#关系:y0 = x0, y1 = x0 + x1, y2 = x0 + x1 + x2……
#python示例
for i,x in enumerate(x):
    if i == 0 :
        y[i] = x[i]
    else:
        y[i] = y[i-1] + x[i]
arr = [1,2,3,4,5]
sum = [0] * (5 + 6)
sum[0] = 0 
for i,x in enumerate(arr):
    sum[i] = arr[i - 1] + sum[i - 1]
for i,x in enumerate(sum):
    print("{}-{}".format(i,x))

#c++代码示例

#关系:y0 = x0, y1 = x0 + x1, y2 = x0 + x1 + x2……
#c++示例

for (int i = 0 ; i < n ; i++)

{

        if (i == 0)

        {

                y[i] = x[i] ;

        }

        else

        {

                y[i] = y[i-1] + x[i] ;

        }

}

#include<bits/stdc++.h>
using namespace std ;

int main()
{
    int arr[5] = {1,2,3,4,5} ;
    int sum[6] ;
    sum[0] = 0 ;
    for (int i = 1 ; i < 6 ; i++)
    {
        sum[i] = arr[i - 1] + sum[i - 1] ;
    }
    
    for (auto i : sum)
    {
        cout << i <<' ';
    }
    return 0 ;
}

 【模板】前缀和_牛客题霸_牛客网 (nowcoder.com)

//c++代码示例
#include <iostream>
using namespace std;
int a[101010] ;
long long sum[101010] ;
int main() {
    int n,q;
    cin >> n >> q ;
    for (int i = 1 ; i <= n ; i++)
    {
        cin>>a[i],sum[i] = sum[i - 1] + a[i] ;
    }

    // int a, b;
    // while (cin >> a >> b) { // 注意 while 处理多个 case
        // cout << a + b << endl;
    // }
    while (q--)
    {
        int l,r ;
        cin >> l >> r ;
        cout << sum[r] - sum[l - 1] << endl;
    }
}
// 64 位输出请用 printf("%lld")
#python代码示例
import sys

# for line in sys.stdin:
#     a = line.split()
#     print(int(a[0]) + int(a[1]))


n, q = map(int, input().strip().split())
data = list(map(int, input().strip().split()))
pre = [0 for _ in range(n)]
pre[0] = data[0]
for i in range(1, n):
    pre[i] = pre[i - 1] + data[i]
for i in range(q):
    l, r = map(int, input().strip().split())
    res = pre[r - 1] - pre[l - 1] + data[l - 1]
    print(res)

##二维前缀和

有一个二维数组a和一个二维前缀和数组b,具有以下关系:
b(x),(y) = b(x-1),(y) + b(x),(y-1) + b(x-1),(y-1) + a(x),(y)

说白了每一个格子的值是从哪里得来的,只能从格子的上方和左方得到,但是在更新每个格子的值的时候,我们需要把第1列和第1行的特殊位置进行更新好,第一列的元素值只能从上方传递过来,第一行的元素只能从左边传递过来。

 

 ##改进,增加了冗余列和行

#python示例

for i in range(len(a)):
    for j in range(len(a[0])):
        if i == 0 and j == 0 :
            b[i][j] = a[i][j]
        if i == 0 : # 第一行
            b[i][j] = b[i][j-1] + a[i][j]
        if j == 0 : # 第一列
            b[i][j] = b[i-1][j] + a[i][j]
        if i != 0 and j != 0 :
            b[i][j] = b[i-1][j] + b[i][j-1] + b[i-1][j-1] + a[i][j]

【模板】二维前缀和_牛客题霸_牛客网 (nowcoder.com)

#pthon代码示例
while True:
    try:
        n, m, q = map(int, input().split())
        l = []
        for _ in range(n):
            l.append(list(map(int, input().split())))
        # dp[i][j]表示起点到l[i-1][j-1]的子矩阵的和
        dp = [[0 for i in range(m + 1)] for j in range(n + 1)]  # 让dp坐标与x1,y1,x2,y2,对齐 并且添加两个辅助列
        for i in range(1, n + 1):  # 行
            for j in range(1, m + 1):  # 列
                # 状态转移方程,dp[i][j]等于其上方所有行之和加上其左方所有列之和减去其左上方行列交叉导致的减掉双倍区域,再加上本单元格的值
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1] + l[i - 1][j - 1] - dp[i - 1][j - 1]
        print(dp)
        for k in range(q):
            x1, y1, x2, y2 = map(int, input().split())
            # (x1, y1) 为左上角 , (x2,y2) 为右下角的子矩阵的和。x2,y2的值 减去 x1, y1上面的行左边的列,再加上重叠相减的部分
            num = dp[x2][y2] + dp[x1 - 1][y1 - 1] - dp[x1 - 1][y2] - dp[x2][y1 - 1]
            print(num)
    except:
        break
//c++代码示例
#include <iostream>
#include <vector>
using namespace std;

int main() {
    // int a, b;
    // while (cin >> a >> b) { // 注意 while 处理多个 case
    //     cout << a + b << endl;
    // }
    int n,m,q;
    cin>>n>>m>>q ;
    long long tmpv ;
    vector<vector<long long>> v(n+1,vector<long long>(m+1, 0));
    for (int i = 1; i <= n ; i++)
    {
        long long sum = 0 ;
        for (int j = 1 ; j <= m ; j++)
        {
            scanf("%ld",&tmpv) ;
            sum += tmpv ;
            v[i][j] = sum + (i > 1 ? v[i-1][j] : 0) ;
        }
    }
    for (int i = 0 ; i < q ; ++i)
    {
        int x1,y1,x2,y2 ;
        cin>>x1>>y1>>x2>>y2 ;
        cout<<v[x2][y2] - v[x1-1][y2] - v[x2][y1-1] + v[x1-1][y1-1]<<endl;

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

 #c++代码示例

for (int i = 0 ; i < n ; i++)

{

        for (int j = 0 ; j < m ; j++)

        {

                if (i == 0 && j == 0)

                {

                        b[i][j] = a[i][j] ;

                }

                

                if (i == 0)

                {

                        b[i][j] = a[i][j - 1] + a[i][j];

                }

                

                if (j == 0)

                {

                        b[i][j] = a[i - 1][j] + a[i][j];

                }

                

                if (i != 0 && j != 0)

                {

                        b[i][j] = b[i-1][j] + b[i][j-1] + b[i-1][j-1] + a[i][j] ;

                }

        }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1664114.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WorkPlus im(即时通讯)集成平台助力政企数字化转型升级

随着互联网技术的不断发展&#xff0c;企业内部通讯软件已经成为企业日常运营中不可或缺的一部分。企业IM&#xff08;即时通讯&#xff09;和移动门户作为企业内部通讯软件的关键组成部分&#xff0c;为企业提供更加高效、便捷的通讯方式&#xff0c;提高了企业的运营效率。 针…

ETLCloud中如何执行Java Bean脚本

ETLCloud中如何执行Java Bean脚本 在ETLCloud这一强大的数据集成和转换平台中&#xff0c;执行Java Bean脚本的能力为其增添了更多的灵活性和扩展性。Java Bean脚本不仅仅是一段简单的代码&#xff0c;而是一种强大的工具&#xff0c;可以帮助用户定制和优化数据处理的每一个环…

笨方法自学python(六)-字符串和文本

上一节中出现了\n&#xff0c;这个作用是换行。\后面带不同字符有不同的作用&#xff0c;我们先简单了解几个&#xff0c; 使用反斜杠 \ (back-slash) 可以将难打印出来的字符放到字符串。针对不同的符号有很多这样的所谓“转义序列(escape sequences)”&#xff0c;我们来练习…

IDEA 常见设置问题

OutOfMemoryError IDEA 第一次运行项目时&#xff0c;会报错误 - java.lang.OutOfMemoryError: Java heap space / insufficient memory&#xff0c;解决办法是&#xff1a; 将图示部分由默认的 700 改为 2048。 import * 工程lint检查时不允许使用import *&#xff0c;IDE…

时间范围交集查询

业务场景&#xff1a; 数据库中时开始时间与结束时间&#xff0c;筛选数据条件将这两个字段&#xff08;开始时间、结束时间&#xff09;糅合成一个字段&#xff0c;并且是范围筛选。 数据库字段&#xff1a; 筛选条件&#xff1a; 数据分析 全部包含&#xff08;子集&#…

短视频收益分成一览表​​​​​​​​​​​​​​​​,视频号怎么做有收益的

今日为大家揭秘一个热门视频号的操作技巧。很多人都已经操作这类账号&#xff0c;并从中获益。视频号目前是市场上非常热门的平台之一&#xff0c;流量之大令人惊叹&#xff0c;先不提那些私域营销的巨大优势&#xff0c;仅从创作分成计划角度来看&#xff0c;已有许多人每天能…

【前端】桌面版docker并部署前端项目

环境 win10专业版 2004 , 需科学 官网下载安装包并安装4.29.0版本 终端输入 wsl --installdocker桌面版和模拟器只能选一个&#xff0c;不然一直转圈圈 镜像配置加速&#xff0c;在settings—>docker engine下 {"builder": {"gc": {"defaultKee…

docker私有仓库registry

简介 Docker私有仓库的Registry是一个服务&#xff0c;主要用于存储、管理和分发Docker镜像。具体来说&#xff0c;Registry的功能包括&#xff1a; 存储镜像&#xff1a;Registry提供一个集中的地方来存储Docker镜像&#xff0c;包括镜像的层次结构和元数据。 版本控制&…

揭秘LLMOps,高效开发大型语言模型

大家好&#xff0c;随着人工智能&#xff08;AI&#xff09;的蓬勃发展&#xff0c;一个新兴领域语言模型运维&#xff08;LLMOps&#xff09;正逐渐成为关注的焦点。LLMOps专注于对大型语言模型&#xff08;LLMs&#xff09;&#xff0c;例如OpenAI的GPT系列&#xff0c;进行全…

无需设置环境变量,Linux下最正确的Java离线安装方式

背景 公司研发网络是离线环境&#xff0c;需要安装Java环境&#xff0c;网上教程大多是在线安装或者通过设置环境变量安装&#xff0c;设置环境变量的方式是最常见的&#xff0c;但确隐藏了很多坑&#xff0c;例如环境变量有时候会不生效&#xff0c;如果你的程序通过systemd启…

ok_Keil实用小技巧 | Keil定制Hex文件名实现的方法

Keil实用小技巧 | Keil定制Hex文件名实现的方法 echo off REM 可执行文件&#xff08;Hex&#xff09;文件名 set HEX_NAMEDemo REM 可执行文件&#xff08;Hex&#xff09;文件路径 set HEX_PATH.\Objects REM 定制Hex输出路径 set OUTPUT_PATH.\Output REM 软件版本文件…

应用案例 | 商业电气承包商借助Softing NetXpert XG2节省网络验证时间

一家提供全方位服务的电气承包商通过使用Softing NetXpert XG2顺利完成了此次工作任务——简化了故障排查的同时&#xff0c;还在很大程度上减少了不必要的售后回访。 对已经安装好的光纤或铜缆以太网网络进行认证测试可能会面临不同的挑战&#xff0c;这具体取决于网络的规模、…

IDEA 好用的插件

图标插件&#xff1a;Atom Material Icons 此插件的作用就是更好的显示各种文件的类别&#xff0c;使之一目了然 汉化包 Chinese ​(Simplified)​ Language Pack / 中文语言包 作用就是 汉化 AI编码助手 GitHub Copilot AI编码助手&#xff1a;提示代码很好用 缺点&#xff1a…

发布GPT-5的方式可能会与以往不同;开源vocode使用 AI 自动拨打电话;开源gpt智能对话客服工具;AI自动写提示词

✨ 1: vocode 用AI通过声音与用户进行实时交流 Vocode是一个旨在帮助开发者快速构建基于声音的大型语言模型&#xff08;LLM&#xff09;应用程序的开源库。简单来说&#xff0c;如果你想要开发一个能够通过声音与用户进行实时交流的应用&#xff0c;比如电话机器人、语音助手…

暗区突围pc资格 暗区突围pc端测试资格获取

《暗区突围》的诞生&#xff0c;仿佛在游戏界投下了一枚深水炸弹&#xff0c;它不仅仅是射击游戏的新标杆&#xff0c;更是对玩家策略思维、生存直觉与团队协作能力的一次全面考验。在这个精心构建的虚拟战场中&#xff0c;每一次踏入暗区&#xff0c;都是对未知的探索&#xf…

Maven- Profile详解

前言 Profile能让你为一个特殊的环境自定义一个特殊的构建&#xff1b;profile使得不同环境间构建的可移植性成为可能。 <project><profiles><profile><build><defaultGoal>...</defaultGoal><finalName>...</finalName><…

【静态分析】软件分析课程实验A3-死代码检测

官网&#xff1a; 作业 3&#xff1a;死代码检测 | Tai-e 参考&#xff1a; https://www.cnblogs.com/gonghr/p/17981720 --------------------------------------------------------------------- 1 作业导览 为 Java 实现一个死代码&#xff08;dead code&#xff09;检…

Matten:视频生成与Mamba-Attention

Matten:视频生成与Mamba-Attention 摘要IntroductionRelated WorkMethodology Matten: Video Generation with Mamba-Attention 摘要 在本文中&#xff0c;作者介绍了Matten&#xff0c;一种具有Mamba-Attention架构的尖端潜在扩散模型&#xff0c;用于视频生成。在极小的计算…

数据结构(一)绪论

2024年5月11日 一稿 数据元素+数据项 逻辑结构 集合 线性结构 树形结构 </

商家转账到零钱开通揭秘,微信支付商户如何玩转分销返佣现金营销

在数字支付日益普及的今天&#xff0c;微信支付凭借其便捷、安全的特性&#xff0c;成为了众多商户的首选支付工具。而微信支付商户平台上的“商家转账到零钱”功能&#xff0c;更是为商户们打开了一扇全新的营销大门。今天&#xff0c;我们就来一起揭秘这个功能聊聊如何快速开…