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

算法学习入门---前缀和(C++)

目录

1.写在前面

2.洛谷---最大子段和

3.洛谷---激光炸弹


1.写在前面

一维二维模板在leetcode前缀和那边

2.洛谷---最大子段和

找出一个元素相和最大的子数组,输出元素相和后的结果

如下图所示,把[0,i]位置处所有的元素相加起来得出sum,再找到这一段区间从头到尾的最小值min,sum - min = max

通过sum变量来模拟dp数组,而不是真的创建一个数组,dp[i] 为从 0 -> i 位置的所有元素和,dp[i] = dp[i-1] + nums[i] -> sum = sum + nums[i]

#include<iostream>
#include<vector>
#include<algorithm>
#include<limits.h>
using namespace std;int main()
{int n;cin>>n;vector<int> nums(n,0);for(int i=0;i<=n-1;i++) cin>>nums[i];int sum = 0,ret = INT_MIN,dp_min = 0;for(int x:nums){sum+=x;//dp[i] = dp[i-1] + nums[i]ret = max(sum-dp_min,ret);dp_min = min(sum,dp_min);}cout<<ret;return 0;
}

代码易错点:

dp_min 需要初始化为0,dp_min 是作为保存前缀和最小值的存在,当极限情况时(例如所有的数都是正数),前缀和min的最小值应该为0(即min的那部分被去掉了)

要先更新ret结果,然后再更新dp_min,倒过来会产生结果偏差,例如全是负数的情况

dp_min 一直被 sum 更新,sum - dp_min 也就恒为 0;换成图来理解的话(如下图),sum 统计的是 0->i 区间,dp_min 应该是 [0,i-1] 区间的前缀和,如果变成 [0,i] 区间了那就什么也没留下了;如果先更新dp_min再更新ret就是dp_min也被更新为了[0,i]区间,所以是错误的

3.洛谷---激光炸弹

以下图为例,m = 2 时 如果想尽可能多的摧毁目标,炸弹的边应该和矩阵的边重合

二维模板:

1.f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1] + a[i][j]

2.sum = f[x2][y2] - f[x1-1][y2] - f[x2][y1-1] + f[x1-1][y1-1] 


3.x1、x2、y1、y2表示:

如下图所示,通过 x2,y2 (右下角端点)来遍历整个数组,那么左上角的另一端点为 [x2 - m + 1, y2 -m + 1]

4.细节问题:

  • 前缀和数组下标从1开始算
  • 因为题目的输入没有给出具体的二维数组起止点,因此就直接开辟以最大值作为边长的数组(maxlen = 5 × 10^3)
  • 可能存在同一位置上有多个目标的情况,因此不能 a[x][y] = v,要 a[x][y] += v

代码:

#include<iostream>using namespace std;const int N = 5010;int n,m;
int a[N][N];
int f[N][N];int main()
{cin>>n>>m;while(n--)//总共有n组数据{int x,y,v;cin>>x>>y>>v;x++,y++;a[x][y] += v;} //创建前缀和数组n = 5001; for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1] + a[i][j];//使用前缀和数组判断出最优解,枚举所有边长为m的正方形 int ret = 0;for(int x2=m;x2<=n;x2++)for(int y2=m;y2<=n;y2++){int x1 = x2 - m + 1,y1 = y2 - m + 1;ret = max(ret,f[x2][y2] - f[x1-1][y2] - f[x2][y1-1] + f[x1-1][y1-1]);} cout<<ret;return 0;
}

http://www.dtcms.com/a/568623.html

相关文章:

  • 一键生成系统架构图
  • 2025国产MOM系统全景透视:谁在领跑智能制造新赛道?
  • 系统架构设计师备考第64天——网络构建关键技术
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第三十五讲)
  • 网站备案个人可以做吗thinkphp cms开源系统
  • 一般电脑网站建设及运营多少钱中国最新军事新闻报道
  • Elasticsearch+Logstash+Filebeat+Kibana部署[7.17.3版本]
  • Elasticsearch单机部署全指南
  • 前端实战开发(三):Vue+Pinia中三大核心问题解决方案!!!
  • 从零开始:开发一个仓颉三方库的完整实战
  • 本机 MongoDB 注册系统服务、启用security认证
  • Nginx代理配置的“双斜杠陷阱“:从IP到域名的完整排查与解决指南
  • 三水容桂网站制作天眼查企业信息查询平台
  • HarmonyOS鸿蒙开发:Swiper组件实现精美轮播图
  • 互联网大厂前端面试实录:HTML5、ES6、Vue/React、工程化与性能优化全覆盖
  • 宣威网站建设公司做钓鱼网站要什么工具
  • VBA中类的解读及应用第二十九讲: 最简单的类属性建立
  • 金蝶用友数据分析:奥威BI解锁ERP智能决策新纪元
  • 用Python做数据分析之数据表清洗
  • AI+CMIP6数据分析与可视化、降尺度技术与气候变化的区域影响、极端气候分析
  • 基于深度神经网络的手术机器人轨迹精准定位与智能存储方案编程(总集下)
  • 【计算机网络】计算机网络体系结构与参考模型
  • 佛山外贸网站建设资讯微信小程序制作教程视频
  • ubuntu22.04 GPU环境安装mindspore
  • 从vw/h到clamp(),前端响应式设计的痛点与进化
  • VAE可以被用到扩散模型中,用于编码和解码。但是GAN网络不行?
  • 《算法闯关指南:优选算法--前缀和》--31.连续数组,32.矩阵区域和
  • 《Flutter全栈开发实战指南:从零到高级》- 10 -状态管理setState与InheritedWidget
  • 网站维护内容梅江区建设局网站
  • 3D工艺数字化:让灵活用工不再难