激光炸弹(二位前缀和+枚举)易懂(c++)

不了解前缀和的小伙伴,点击下方
(https://blog.csdn.net/tobeyours/article/details/79746095)

#include<iostream>
#include<stack>
#include<vector>
#include<map>
#include<queue>
#include<set>
const int N = 5050;//C++中的特性:也可以在main函数中定义一个
int a[N][N];
int R;
int x11, y11, v11;//原来y1在math.h函数内已经定义过了
int m = 0, n = 0;
using namespace std;
int main()
{
	int N, R;
	cin >> N >> R;
	m = n = R;
	while (N--)
	{
		cin >> x11 >> y11 >> v11;
		x11++; y11++;
		a[x11][y11] += v11;//同一个位置 可能会有多个价值点
		m = max(m, x11);//确保边界>=R  为什么:因为会出现R大于矩阵的情况 所以X11很有可能取到比R小的数 作为后面循环条件的m至少要>=R
		n = max(n, y11);
	}
	for (int i = 1; i <= m; i++)
		for (int j = 1; j <= n; j++)
		{
			a[i][j] += a[i - 1][j] + a[i][j - 1] - a[i - 1][j - 1];

		}
	int max_s = -99999999;
	/*
	m为矩阵的列 n为矩阵的行
	*/
	for(int i = R; i <= m; i++)//都是枚举R*R矩阵右下角的点 直接从R开始循环 只因为比R小的矩阵都会被R包括在内
		                         //假设R=3 就可以从(3,3)开始找,因为(2,2)等等之类的矩阵和都会比(3,3)小
		for (int j = R; j <= n; j++)
		{
			max_s = max(max_s, a[i][j] - a[i - R][j] - a[i][j - R] + a[i - R][j - R]);
		}
	cout << max_s << endl;
}

/*
2 1
0 0 1
1 1 1
*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值