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

##前缀和

指的是某序列的前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.mzph.cn/pingmian/10187.shtml

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

相关文章

上位机图像处理和嵌入式模块部署(树莓派4b和电源供给)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面&#xff0c;我们说过pc电脑和嵌入式设备&#xff0c;两者都可以实现相同的软件功能。但是和pc相比较&#xff0c;嵌入式设备不仅价格更便宜&a…

计算机视觉——OpenCV实现Lucas-Kanade 光流

1.光流 光流法是计算机视觉中用于估计图像序列中物体运动的关键技术。它类似于观察夜空中的彗星&#xff0c;通过其在天空中的运动轨迹来追踪它的路径。在图像处理中&#xff0c;光流帮助我们理解像素点如何在连续的帧之间移动。 1.1 稀疏光流法 稀疏光流法关注于图像中的关…

Web3空投入门:如何增加空投成功的几率

今天分享空投如何避免限制以提高效率&#xff0c;增加成功几率&#xff0c;首先我们来了解什么是空投加密&#xff0c;有哪些空投类型。 一、什么是空投加密&#xff1f; 加密货币空投是一种营销策略&#xff0c;包括向用户的钱包地址发送免费的硬币或代币。 加密货币项目使用…

Leetcode—155. 最小栈【中等】

2024每日刷题&#xff08;130&#xff09; Leetcode—155. 最小栈 实现代码 class MinStack { public:MinStack() {}void push(int val) {if(st.empty()) {st.emplace(val, val);} else {st.emplace(val, min(val, st.top().second));}}void pop() {if(st.empty()) {return;}…

【漏洞复现】用友U8-Cloud XChangeServlet XXE漏洞

0x01 产品简介 用友U8Cloud是用友推出的新一代云ERP,主要聚焦成长型、创新型企业,提供企业级云ERP整体解决方案。 0x02 漏洞概述 用友U8 cloud /service/XChangeServlet接口存在XXE漏洞,未授权的攻击者可通过此漏洞获取数据库敏感信息,从而盗取服务器数据,造成服务器信…

林更新博士之路星途璀璨再启航

林更新&#xff1a;博士之路&#xff0c;星途璀璨再启航在这个充满机遇与挑战的时代&#xff0c;有一位演员以其出色的演技和不懈的努力&#xff0c;赢得了无数观众的喜爱。他&#xff0c;就是林更新。今日&#xff0c;一条消息如重磅炸弹般在娱乐圈炸开&#xff0c;让无数粉丝…

UBOOT介绍

一、UBOOT简介 U-boot全称 Universal Boot Loader&#xff0c;是遵循GPL条款的开放源码项目&#xff0c;uboot 是一个裸机代码&#xff0c;可以看作是一个裸机综合例程&#xff0c;执行启动内核的功能。 补充&#xff1a;GPL条款&#xff08;GNU General Public License&…

空间复杂度与链表刷题

"一切的一切都是你自己在感应." 本文索引 空间复杂度复杂度实例实例1实例2实例3 链表题目1. 返回倒数第K个节点2. 链表的回文结构3. 相交链表4. 随机链表的复制5. 环形链表 总结: 前言: 本文主要探究空间复杂度与链表题目讲解 更多文章点击主页: 酷酷学!!! 如果此文对…

AI时代:低代码与人工智能引领科技创造新时代

随着科技的飞速发展&#xff0c;我们步入了一个崭新的时代——AI时代。在这个时代&#xff0c;低代码和人工智能技术如日中天&#xff0c;成为引领科技创造的新引擎。本文将围绕这一主题&#xff0c;探讨低代码和人工智能如何在各个领域发挥巨大作用&#xff0c;推动科技创造迈…

Linux 之 tail 命令

一、基本语法 tail [option] [file] 其中 option 是可选参数&#xff0c;用于定制命令的行为&#xff0c;file 则是要处理的目标文件名。 二、常用参数 几个常用的 option 选项&#xff1a; -n&#xff1a;显示文件的最后 n 行&#xff0c;默认为 10 行。-f&#xff1a;实…

13. WINCC -- C脚本实现弹窗调用(根据鼠标更改弹窗位置)

C脚本实现弹窗调用&#xff08;根据鼠标更改弹窗位置&#xff09; #include "apdefap.h" void Click(char* lpszPictureName, char* lpszObjectName ) { #define H 300 //弹窗高度&#xff08;可以不用只需要在弹窗属性中选择调整大小即可&#xff09; #define W …

构建内网yum仓库

1、环境介绍 系统&#xff1a;龙蜥os 7.9 2、安装epel源 yum install epel-release -y3、安装nginx服务器并启动 yum install nginx httpd -y配置 server {listen 80;server_name repo.wtown.com;root /usr/share/nginx/html/repo;index index.html index.htm;location / {…

Sora惊艳亮相:AI技术掀起创作革命,影视产业迎来新风貌!

Sora平台近期发布了名为"Sora首次印象"的更新&#xff0c;为用户带来了令人瞩目的变化。该更新不仅展示了Sora平台的发展方向&#xff0c;还介绍了其在电影制作、广告宣传等领域的潜在应用。 同时&#xff0c;Sora的首席执行官Sam Altman与好莱坞影视工作室进行了会…

基于Python的数据分组技术:将数据按照1, 2, 3规则分为三个列表

目录 一、引言 二、数据分组原理与意义 三、案例分析 四、代码实现与解释 五、对新手友好的解释 六、技术细节与扩展 七、实际应用场景 八、总结 一、引言 在数据处理和分析的广阔领域中&#xff0c;数据分组是一项基础且重要的任务。数据分组通常指的是将数据集中的元…

Qt程序打包命令windeployqt.exe的使用方法

Qt程序打包命令windeployqt.exe的使用方法&#xff1a; 一、该命令是Qt自带的程序&#xff0c;位于d:\Qt\Qt5.14.2\5.14.2\mingw74_64\bin文件夹中。 二、添加环境变量。 三、把Qt生成的debug或release文件夹中的bin文件兲中的内容拷贝至D:\temp文件夹中&#xff0c;并在文件管…

在做题中学习(55):一维前缀和模板

【模板】前缀和_牛客题霸_牛客网 (nowcoder.com) 题目解释&#xff1a; 注意&#xff1a;下标从1开始的。 l 和 r就是对这n个整数去取一个区间&#xff0c;例如示例一&#xff1a; (1,2) 区间 就是算出1 2 4 中 1&#xff0c;2下标对应值的和&#xff0c;12 3 同理,(2,3) …

Nginx配置项详解

Nginx&#xff0c;以其高性能、稳定性强、资源消耗低的特性&#xff0c;成为众多网站和应用首选的Web服务器及反向代理服务器。其配置文件的灵活性和丰富性是其强大功能的关键所在。本文将深入解析Nginx配置文件中的核心概念与关键配置项&#xff0c;帮助您更好地理解和定制Ngi…

springboot2.x集成Elasticsearch7.7.0

一、前言 elasticsearch安装就不做过多介绍了&#xff0c;网上一搜一大堆&#xff1b;最需要注意的就是Elasticsearch与spring版本&#xff0c;防止版本不兼容导致的后续的一系列问题。我这里springbootspring-data-elasticsearch&#xff0c;他们的版本对照关系可以参照sprin…

vue2后台管理项目

一:项目准备 1)拉取模板代码 远程仓库复制到本地仓库. 2)安装后的项目 路径 code 文件夹 会打开vscode的文件夹. 3)安装vetur和eslint插件可以保存时自动修改不规范的地方. 4)App内有一级路由,路由组件导入如果是layout架子,会导入的是文件夹下的index.js没有则导入index.v…

智能电视遇险?海信、TCL、小米“上下求索”

众所周知&#xff0c;智能化已经成为各行各业的发展新方向&#xff0c;家电行业更是早早掀起了智能化浪潮&#xff0c;越来越多的智能家电产品涌现出来。在客厅场景&#xff0c;电视毫无疑问是众多家电中的C位&#xff0c;而在智能化浪潮的助推下&#xff0c;电视这一产品同样开…