当前位置: 首页 > wzjs >正文

成都网站建设企业预约做家庭清洁的网站

成都网站建设企业,预约做家庭清洁的网站,wordpress接入扫码支付,宁波制作手机网站一、【模板】前缀和 题目解析 这道题,给定一个长度为n的数组,和m次询问; 每一次询问给出两个整数l和r,让我们求出区间[l , r]中所有数的和,然后输出。 算法思路 这道题暴力解法: 首先是m次查询&#xff0…

一、【模板】前缀和

题目解析

在这里插入图片描述

这道题,给定一个长度为n的数组,和m次询问;

每一次询问给出两个整数lr,让我们求出区间[l , r]中所有数的和,然后输出。

算法思路

这道题暴力解法:

首先是m次查询(m次测试),每一个给定一个lr,让我们求区间[l , r]中所有数的和。

暴力解法就非常简单了,直接遍历区间[l , r],求出区间中所有数的和即可。

暴力解法时间复杂度O(m * n),也就是O(n^2)级别的时间复杂度;

暴力解法会超时,我们这里想一想可不可以对暴力解法进行一些优化:

  1. 首先m次查询,很显然是不能进行优化的。
  2. 我们只能对求区间[l , r]中所有数的和进行优化。

那如何优化呢?

遍历区间[l , r]来求和时间复杂度是O(n),那我们可不可以用O(1)的复杂度来获得区间[l , r]中所有数的和呢?

在这里插入图片描述

通过上图,我们可以发现:我们要求的[l , r]区间的和s就等于区间[1 , r]的和 减去区间[1 , l]的和。

前缀和

所以,我们可以通过运算来用O(1)的时间复杂度获得区间[l , r]中所有数的和;但是我们要用到区间[1 , l]和区间[1 , r]中所有数的和。

所以我们预先既要处理一个前缀和数组dp

  • 其中dp[i]:表示区间[1 , i]中所有数的和。
  • 填写前缀和数组:dp[i] = dp[i-1] + arr[i](也就是前面所有数的和加上当前位置的数)。
  • 计算区间[l , r]中所有数的和:dp[r] - dp[l-1](这里区间[l , r]包含l位置,所以要减去dp[i-1]

这里可以说:前缀和和动态规划的大致思路非常相似:

状态表示dp[i]表示区间[1 , i]中所有数的和

状态转移方程dp[i] = dp[i] + arr[i];

获取区间[l , r]中所有数的和s = dp[r] - dp[l-1];

代码实现

#include <cmath>
#include <iostream>
using namespace std;
const int N = 100001;
long long dp[N];
int arr[N];
int n, m;
int main() {cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> arr[i];dp[i] = dp[i - 1] + arr[i];}while (m--) {int l, r;cin >> l >> r;cout << dp[r] - dp[l - 1] << endl;}return 0;
}

二、【模板】二维前缀和

题目解析

在这里插入图片描述

对于这道题,给定一个n*m的二维数组,以及q次查询;

每一次查询给定x1,x2,y1,y2,我们要求以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵中所有数的和。

算法思路

暴力解法:

q次查询,每一查询给定x1,y1,x2,y2,遍历整个子矩阵进行求和操作。

时间复杂度:O(n*m*q),也就是O(n^3)级别的时间复杂度。

很显然会超时,对暴力解法进行优化,很显然只能优化求子矩阵中所有元素的和。

暴力解法中,遍历整个子矩阵去求和,这样太麻烦了;我们可不可以使用O(1)的时间复杂度拿到子矩阵中所有数的和?

当然也是可以的,这就像数学当中求一块面积的和一样。

在这里插入图片描述

如上图所示,我们要求以(x1 , y1)为左上角,(x2 , y2)为右下角的子矩阵中所有数的和,也就是S

我们只要知道s1(以(1 , 1)为左上角,(x1-1 , y1)为右下角的子矩阵的和)、s2(以(1 , 1)为左上角,(x2, y1-1)为右下角的子矩阵的和)、s3(以(1 , 1)为左上角,(x1-1 , y1-1)为右下角的子矩阵的和)以及s4(以(1 , 1)为左上角,(x2 , y2)为右下角的子矩阵的和)。

我们就可以通过数学运算来求Ss = s4 - s1 - s2 + s3

也就是s = dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1]

这样我们在填写前缀和表时:

在这里插入图片描述

dp[i][j] = dp[i][j-1] +dp[i-1][j] - dp[i-1][j-1] + arr[i][j]

这里也可以将前缀和理解为动态规划

状态表示dp[i][j]表示以(1,1)为左上角,(i,j)为右下角的子矩阵中所有数的和。

状态转移方程dp[i][j] = dp[i][j-1] +dp[i-1][j] - dp[i-1][j-1] + arr[i][j]

计算子矩阵中所有数的和s = dp[x2][y2] - dp[x2][y1-1] - dp[x1-1][y2] + dp[x1-1][y1-1]

代码实现

#include <iostream>
using namespace std;
const int N = 1001;
int arr[N][N];
long long dp[N][N];
int n, m, q;
int x1, x2, y1, y2;int main() {cin >> n >> m >> q;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] - dp[i - 1][j - 1] + arr[i][j];}}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;
}

总结

这里简单总结一下前缀和算法:

首先前缀和算法可以用来快速的求出子数组/子矩阵中所有数的和,在涉及到求子数组/子矩阵的和时,能够利用前缀和算法来快速的求和。

其次,使用前缀和,我们就要预先构建一个前缀和数组并填写该数组;(和动态规划类似)

注意:在构建前缀和数组时,通常下标从1开始,因为在填写数组时要用到dp[i-1]

最后,前缀和算法就是空间换时间,通过预先构建前缀和数组,让我们能够在O(1)的数据复杂度拿到子数组/子矩阵的和。

到这里本篇文章内容就结束了,感谢各位大佬的支持


文章转载自:

http://HhdOuBiy.qkdcb.cn
http://bfT4154M.qkdcb.cn
http://LnQ0UsTB.qkdcb.cn
http://HEthEyIL.qkdcb.cn
http://DyAv83Ot.qkdcb.cn
http://vMHmaymW.qkdcb.cn
http://HADB2zUO.qkdcb.cn
http://4VmTKfZP.qkdcb.cn
http://wGeFsVH5.qkdcb.cn
http://8WIASMFl.qkdcb.cn
http://nFBVBAHj.qkdcb.cn
http://tR4TCW7j.qkdcb.cn
http://VJvXyi78.qkdcb.cn
http://CceRhOlR.qkdcb.cn
http://VA5jNYiL.qkdcb.cn
http://A31DZD3G.qkdcb.cn
http://gcPv2TXo.qkdcb.cn
http://mHHmV94S.qkdcb.cn
http://dA6GGDUr.qkdcb.cn
http://weuGs0qh.qkdcb.cn
http://WdIKLloj.qkdcb.cn
http://2l7na0wm.qkdcb.cn
http://ratmKvNK.qkdcb.cn
http://v0Mpr2Sf.qkdcb.cn
http://9ObZEknH.qkdcb.cn
http://qyYiDuKy.qkdcb.cn
http://9vSfHSpL.qkdcb.cn
http://nEGOGmeP.qkdcb.cn
http://obQuLWoX.qkdcb.cn
http://OrBzU3PX.qkdcb.cn
http://www.dtcms.com/wzjs/671423.html

相关文章:

  • 如何自己网站接装修生意做做调查问卷换赏金的网站
  • 做个网站成功案例dreamware怎么做网站
  • 咸阳网站建设推广新网站怎样做外链
  • 衡水移动网站建设价格中国建设监理网站
  • 网站设计策划书案例湘潭做网站 用户多磐石网络
  • 免费wap网站推荐wordpress 图片链接
  • 具体的网站建设方案百度搜索引擎优化的推广计划
  • 预登记网站开发 会议住房建设官方网站
  • 宁波网站关键词优化排名小程序源码网免费
  • 汕头网站建设设计价格淘宝商家网站建设
  • 万网个人网站怎么备案专业郑州做网站的公司
  • 上海单位网站建设宁德市医院
  • 做服装哪个网站图片多建筑人才网评职称
  • 庞各庄网站建设wordpress自定义模块自定义字段
  • 德惠市建设局网站wordpress图文调用
  • 基于html5的购物网站开发品牌建设交流会讲话
  • 成都小程序开发公司郑州见效果付费优化公司
  • 网站建设五年发展规划太原小程序制作
  • c2c网站代表和网址品牌建设推荐
  • 高端装饰公司网站设计网页设计流程顺序
  • 培训网网站源码深圳汽车网站建设
  • 赣州建设公司网站滨州网站建设滨州
  • 聊城开发区人才网seo是什么意思中文
  • html5手机网站源码下载关于文化馆网站建设的材料
  • 漯河做网站的公司宣传册画册设计公司
  • 能够做渗透的网站广告公司怎么宣传自己
  • 外贸网站建站ntitle wordpress
  • 天津做一个简单的网站中国台州网
  • 做商品推广有那些网站网站建设的商品分类编码
  • 自己有网站想制作个程序网站建设空间一般多大