【算法挨揍日记】day13—— DP34 【模板】前缀和、DP35 【模板】二维前缀和

2023-10-11 21:45

本文主要是介绍【算法挨揍日记】day13—— DP34 【模板】前缀和、DP35 【模板】二维前缀和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  DP34 【模板】前缀和

【模板】前缀和_牛客题霸_牛客网

题目描述: 

给定一个长度为n的数组. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出

输入描述:

第一行包含两个整数n和q.第二行包含n个整数, 表示.接下来q行,每行包含两个整数   l和r.

输出描述:

输出q行,每行代表一次查询的结果.

示例1

输入

3 2
1 2 4
1 2
2 3

输出

3
6

解题思路:

 我们可以可以通过暴力的解法去解决这个问题,但是这样时间复杂度会比较高,达到O(n*q)

我们可以对暴力解法进行优化:

我们以【1,4,7,2,5,8,3,6,9】这个数组来讲解前缀和(快速求出数组中某个连续区间的元素和)这个算法

index为数组下标,至于为什么下标从一开始后面会讲!!!

 我们提前弄一个前缀和数组dp,这个数组的元素dp【i】代表【1,i】区间内所有元素之和

我们在求dp的时候肯定不可以用暴力解法,不然的话时间复杂度又上去了,

dp【i】代表 【1,i】区间内所有元素之和,那dp【i-1】代表 【1,i-1】区间内所有元素之和

  • dp【i】就可以等于dp【i-1】+arr【i】

那我们再来看看题目,题目要求我们输出从l到r区间内所有元素之和

那我们可以直接输出dp【r】-dp【l-1】

  • 这里我们把下标设为1开始,是因为我们的dp在算的时候会用到i-1的位置,如果i从0开始就会出现越界的情况

解题代码:

#include <iostream>
#include<vector>
using namespace std;
int main() {int n,q;cin>>n>>q;vector<int> arr(n+1);for(int i=1;i<=n;i++) cin>>arr[i];vector<long long> dp(n+1);for(int i=1;i<=n;i++) dp[i]=dp[i-1]+arr[i];while(q--){int l,r;cin>>l>>r;cout<<dp[r]-dp[l-1]<<endl;}return 0;
}
// 64 位输出请用 printf("%lld")

DP35 【模板】二维前缀和

题目描述:

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

输入描述:

第一行包含三个整数n,m,q.

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

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

解题思路: 

首先如果我们使用暴力解法时间复杂度,直接就是O(n*m*q),我们可以对其使用前缀和算法优化

我们可以创建一个(n+1)*(m+1)的的数组arr和(n+1)*(m+1)的的前缀和数组dp

  •  这里数组坐标加一也是为了防止越界的情况

dp【i】【j】代表从(1,1)~(i,j)这个区间内所有元素之和

我们如何快速求出dp【i】【j】的值呢?以下面这个数组为例,假设我们要求的是dp【3】【3】

 我们先来观察一个通用图:我们要求多少A+B+C+D之和

 A+B+C+D=(A+B)+(A+C)+D-A,括号内的是一个整体

我们可以结合下标的关系推导进一步的关系

  A+B+C+D=(A+B)+(A+C)+D-A

                  =dp【i-1】【j】+dp【i】【j-1】+arr【i】【j】-dp【i-1】【j-1】

这样我们就求出来了dp的每一个数了,回到题目上,题目要求我们输出(x1,y1)~(x2,y2)这个区间内的所有元素之和,假设让我们输出是是这个区间

  •  D=(A+B+C+D)-(A+B)-(A+C)+A

 

D=(A+B+C+D)-(A+B)-(A+C)+A

  = dp【x2】【y2】-dp【x1-1】【y2】-dp【x2】【y1-1】+dp【x1-1】【y1-1】

为了防止越界,我们开辟数组也要多开一行一列

解题代码:

#include <iostream>
#include<vector>
using namespace std;
int main() {int n,m,q;cin>>n>>m>>q;int arr[n+1][m+1];long long dp[n+1][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-1][j]+dp[i][j-1]+arr[i][j]-dp[i-1][j-1];}}while(q--){int x1,x2,y1,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;
}
// 64 位输出请用 printf("%lld")

这篇关于【算法挨揍日记】day13—— DP34 【模板】前缀和、DP35 【模板】二维前缀和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/191029

相关文章

CSS3 最强二维布局系统之Grid 网格布局

《CSS3最强二维布局系统之Grid网格布局》CS3的Grid网格布局是目前最强的二维布局系统,可以同时对列和行进行处理,将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,本文介... 深入学习 css3 目前最强大的布局系统 Grid 网格布局Grid 网格布局的基本认识Grid 网

golang字符串匹配算法解读

《golang字符串匹配算法解读》文章介绍了字符串匹配算法的原理,特别是Knuth-Morris-Pratt(KMP)算法,该算法通过构建模式串的前缀表来减少匹配时的不必要的字符比较,从而提高效率,在... 目录简介KMP实现代码总结简介字符串匹配算法主要用于在一个较长的文本串中查找一个较短的字符串(称为

通俗易懂的Java常见限流算法具体实现

《通俗易懂的Java常见限流算法具体实现》:本文主要介绍Java常见限流算法具体实现的相关资料,包括漏桶算法、令牌桶算法、Nginx限流和Redis+Lua限流的实现原理和具体步骤,并比较了它们的... 目录一、漏桶算法1.漏桶算法的思想和原理2.具体实现二、令牌桶算法1.令牌桶算法流程:2.具体实现2.1

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

基于Java实现模板填充Word

《基于Java实现模板填充Word》这篇文章主要为大家详细介绍了如何用Java实现按产品经理提供的Word模板填充数据,并以word或pdf形式导出,有需要的小伙伴可以参考一下... Java实现按模板填充wor编程d本文讲解的需求是:我们需要把数据库中的某些数据按照 产品经理提供的 word模板,把数据

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

poj2576(二维背包)

题意:n个人分成两组,两组人数只差小于1 , 并且体重只差最小 对于人数要求恰好装满,对于体重要求尽量多,一开始没做出来,看了下解题,按照自己的感觉写,然后a了 状态转移方程:dp[i][j] = max(dp[i][j],dp[i-1][j-c[k]]+c[k]);其中i表示人数,j表示背包容量,k表示输入的体重的 代码如下: #include<iostream>#include<

hdu2159(二维背包)

这是我的第一道二维背包题,没想到自己一下子就A了,但是代码写的比较乱,下面的代码是我有重新修改的 状态转移:dp[i][j] = max(dp[i][j], dp[i-1][j-c[z]]+v[z]); 其中dp[i][j]表示,打了i个怪物,消耗j的耐力值,所得到的最大经验值 代码如下: #include<iostream>#include<algorithm>#include<

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个