算法题(130):激光炸弹

审题:

本题需要我们找出激光炸弹所能炸毁的最大价值并打印

思路:
方法一:二维前缀和

**炸弹缺陷分析:**题目中说目标若位于炸弹的边上就不能炸毁目标,其实是要求我们的炸弹必须完全包围目标方可炸毁

图示的阴影区域是m为1的激光炸弹,如果我们如图摆放炸弹,那么将没有目标被炸毁,因为没有一个目标是完全被炸弹包围住的

总体思路:

**1.计算二维前缀和f:**f[i][j]表示以(0,0)坐标为矩形左上角到以(i,j)坐标位矩形右下角的矩形区域的价值之和

**2.枚举所有炸弹摆放情况:**由于炸弹只能与x轴y轴平行的摆放,所以我们可以根据右下角坐标和边长m来枚举确定所有摆放情况

3.计算每个摆放情况的炸弹炸毁价值总和并用max维护answer,确保遍历结束后answer就是最大炸毁价值

解题:

cpp 复制代码
nclude<iostream>
using namespace std;
int n, m;
const int N = 5010;
int a[N][N];//记录初始状态
int f[N][N];//前缀和
int answer;
int main()
{
	cin >> n >> m;
	while (n--)
	{
		int x, y, v;
		cin >> x >> y >>v;
		x++, y++;//将索引基准升为1
		a[x][y] += v;//每一个位置价值可能重复叠加
	}
	//前缀和计算
	for (int i = 1; i <= 5001; i++)
	{
		for (int j = 1; j <= 5001; j++)
		{
			f[i][j] = f[i - 1][j] + f[i][j - 1] - f[i - 1][j - 1] + a[i][j];
		}
	}
	m = min(m, 5001);//将m大于整个区域的情况兼容
	//枚举右下角坐标所有情况
	for (int i = m; i <= 5001; i++)
	{
		for (int j = m; j <= 5001; j++)
		{
			int x1 = i - m + 1;
			int y1 = j - m + 1;
			int sum = f[i][j] - f[x1 - 1][j] - f[i][y1 - 1] + f[x1-1][y1-1];
			answer = max(answer, sum);
		}
	}
	cout << answer << endl;
	return 0;
}

1.本题中坐标的边界就是5000,所以我们将N定义为5010就足够用来定义数组a和f了

2.记录数据的时候注意要用+=符号来添加,因为题目中说明了同一个位置可能存在多个目标,所以一个坐标位置的价值可能会叠加

3.为了兼容m大于边界的情况,我们将这种情况的m置为边界即可

P2280 [HNOI2003] 激光炸弹 - 洛谷

相关推荐
weixin_30777913几秒前
矩形势阱(V(x) = -H for |x|≤L)的束缚态能级求解与宇称分类
算法
MMjeaty28 分钟前
数据结构——栈和队列
数据结构·算法
瓜瓜怪兽亚32 分钟前
前端基础知识---10 Node.js(三)
数据结构·数据库·node.js
机器学习之心6 小时前
多目标鲸鱼优化算法(NSWOA),含46种测试函数和9个评价指标,MATLAB实现
算法·matlab·多目标鲸鱼优化算法·46种测试函数·9个评价指标
古译汉书6 小时前
嵌入式铁头山羊STM32-各章节详细笔记-查阅传送门
数据结构·笔记·stm32·单片机·嵌入式硬件·个人开发
max5006006 小时前
基于Meta Llama的二语习得学习者行为预测计算模型
人工智能·算法·机器学习·分类·数据挖掘·llama
橘颂TA8 小时前
【数据结构】解锁数据结构:通往高效编程的密钥
数据结构
王哥儿聊AI8 小时前
Lynx:新一代个性化视频生成模型,单图即可生成视频,重新定义身份一致性与视觉质量
人工智能·算法·安全·机器学习·音视频·软件工程
手握风云-9 小时前
优选算法的寻踪契合:字符串专题
算法
闭着眼睛学算法9 小时前
【华为OD机考正在更新】2025年双机位A卷真题【完全原创题解 | 详细考点分类 | 不断更新题目 | 六种主流语言Py+Java+Cpp+C+Js+Go】
java·c语言·javascript·c++·python·算法·华为od