【算法通关指南:算法基础篇】 二维前缀和专题: 1. 【模板】二维度前缀和,2.激光炸弹

【算法通关指南:算法基础篇】 二维前缀和专题: 1. 【模板】二维度前缀和,2.激光炸弹

《算法通关指南:算法基础篇 ---- 二维前缀和 — 1. 【模板】二维度前缀和,2.激光炸弹》

在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人方向学习者
❄️个人专栏:《算法通关指南 》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录

前言

本专栏聚焦算法题实战,系统讲解算法模块:以《c++编程》,《数据结构和算法》《基础算法》《算法实战》 等几个板块以题带点,讲解思路与代码实现,帮助大家快速提升代码能力ps:本章节题目分两部分,比较基础笔者只附上代码供大家参考,其他的笔者会附上自己的思考和讲解,希望和大家一起努力见证自己的算法成长

一、二维前缀和

1.1 核心问题

1.1.1 创建前缀和矩阵

创建前缀和矩阵f[i][j] = f[i − 1][j] + f[i][j − 1] − f[i − 1][j − 1] + a[i][j]

在这里插入图片描述

2.2.2 查询以(x1 , y1)为左上角,(x2 , y2)为右下角的子矩阵的和

核心公式:f[x2][y2] - f[x1 - 1][y2] - f[x2][y1-1] + f[x - 1][y1- 1]

在这里插入图片描述

二、二维前缀和经典算法题

2.1【模板】前缀和

2.1.1题目

链接:【模板】二维度前缀和

在这里插入图片描述

2.1.2 算法原理

依照刚才讲解前缀和原理模拟即可

2.1.3代码

#include<iostream> using namespace std;typedeflonglong LL;constint N =1010; LL f[N][N];intmain(){int n, m, q; cin >> n >> m >> q;for(int i =1; i <= n; i++){for(int j =1; j <= m; j++){ LL x; cin >> x; f[i][j]= f[i -1][j]+ f[i][j -1]- f[i -1][j -1]+ x;}}while(q--){int x1, y1, x2, y2; cin >> x1 >> y1 >> x2 >> y2; cout << f[x2][y2]- f[x1 -1][y2]- f[x2][y1 -1]+ f[x1 -1][y1 -1]<< endl;}return0;}

2.2 激光炸弹

2.2.1 题目

链接:激光炸弹

在这里插入图片描述

2.2.2 算法原理

可以用一个二维矩阵将所有目标的价值存起来,其中a[i][j] 表示[i, j] 位置的目标价值之和。
一颗炸弹能够获得的价值正好是一个R × R的一个正方形内所有目标的价值总和,那么我们可以求出矩阵的前缀和矩阵,然后枚举所有边长为R 的子正方形的价值之和,求出里面的最大值即可。
解决两个核心问题:
(1)如何枚举边长为R 的所有正方形:
• 仅需枚举右下角[x2 , y2 ] (R + 1 ≤ x2 ≤ 5000, R + 1 ≤ y2 ≤ 5000) ,那么结合边长, 就可算出左上角[x2 − R + 1, y2 − R + 1] 。

• 代入前缀和矩阵中,就可以快速求出这个正方形内所有目标的总价值。
(2)细节问题:
•题目中某⼀个位置会「重复」出现,因此a[i][j]+ = w ;
• 半径R 可能「超过5000 」,此时炸弹可以摧毁所有目标,也就是整个矩阵的目标价值之和。

2.2.3 代码

#include<iostream>#include<cmath> using namespace std;constint N =5010;int f[N][N];int a[N][N];int n, m;intmain(){ cin >> n >> m;for(int i =1; i <= n; i++){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];}int ret =0; m =min(m, n);for(int x2 = m; x2 <= n; x2++){for(int y2 = m; y2 <= n; y2++){int x1 = x2 - m +1;int 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 << endl;return0;}

总结与每日励志

✨本文介绍了二维前缀和的核心概念与应用,包括如何构建前缀和矩阵(公式:f[i][j] = f[i-1][j] + f[i][j-1] - f[i-1][j-1] + a[i][j])以及查询子矩阵和的快速计算方法。通过两道经典算法题(模板题和激光炸弹)演示了实际应用,强调正确处理边界条件和重复值的重要性。文章最后以励志话语作结,鼓励读者坚持学习算法编程。

在这里插入图片描述

Read more

黑马程序员java web学习笔记--后端进阶(二)SpringBoot原理

目录 1 配置优先级 2 Bean的管理 2.1 Bean的作用域 2.2 第三方Bean 3 SpringBoot原理 3.1 起步依赖 3.2 自动配置 3.2.1 实现方案 3.2.2 原理分析 3.2.3 自定义starter 1 配置优先级 SpringBoot项目当中支持的三类配置文件: * application.properties * application.yml ❤ * application.yaml 配置文件优先级排名(从高到低):properties配置文件 > yml配置文件 > yaml配置文件 虽然springboot支持多种格式配置文件,但是在项目开发时,推荐统一使用一种格式的配置。

By Ne0inhk

别再手动切图!用 ClaudeCode+Figma-MCP 实现 UI 设计 1:1 前端还原

使用 Figma-MCP 实现设计还原 Figma-MCP(Measure Copy Paste)是 Figma 的插件,能够快速提取设计稿中的间距、颜色、尺寸等参数,避免手动测量。安装后选中元素即可查看属性,按 Alt 键复制数值,直接粘贴到代码中。 配置 ClaudeCode 生成代码 ClaudeCode 是 Claude 的代码生成功能,支持根据设计参数输出前端代码。在对话中描述需求并附上 Figma-MCP 提取的数据,例如: 生成一个 React 按钮组件,参数如下: - 宽度:120px - 高度:40px - 背景色:#3B82F6 - 圆角:8px - 文字:"

By Ne0inhk
200+有趣的HTML前端游戏项目合集(5月17日更新,持续更新中)

200+有趣的HTML前端游戏项目合集(5月17日更新,持续更新中)

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【星海导航】💅 想寻找共同学习交流,摸鱼划水的小伙伴,请点击【全栈技术交流群】 两百个简单的 HTML 游戏项目,可提高你的前端技能。 海拥摸鱼小游戏 在线地址(持续更新中):https://game.haiyong.site 源码可联系站长获取 ⭐️ 星标为热门小游戏 游戏项目汇总 ✨ 编号游戏说明1⭐️杀死国王:https://haiyong.site/moyu/kill-the-king.html疯狂点击空格键就行2挡板小游戏:https://haiyong.site/moyu/danban.html随心所欲的放挡板,挡住下面掉下来的球球3吃豆人游戏:https://haiyong.site/moyu/dou.html吃豆人在走路的时候不会停下,只能转方向。通过你的智慧去闯关吧🎉4飞越天空之城:https://haiyong.site/moyu/

By Ne0inhk

傅里叶级数 傅里叶变换 离散时间傅里叶变换(DTFT) 离散傅里叶级数(DFS) 离散傅里叶变换(DFT)快速傅里叶变换(FFT)

傅里叶变换 傅里叶级数 FS 傅里叶变换 FT 时域采样 离散时间傅里叶变换 DTFT 时域采样 离散傅里叶级数 DFS 取有限长视为周期序列的主值周期 取其一个周期 离散傅里叶变换 DFT 频域采样 周期连续信号 离散非周期频谱 非周期连续信号 连续非周期频谱 非周期离散序列 连续周期频谱 周期离散序列 离散周期频谱

By Ne0inhk