题目
- 原题地址:激光炸弹
- 题目编号:NC20032
- 题目类型:前缀和
- 时间限制:C/C++ 1秒,其他语言2秒
- 空间限制:C/C++ 262144K,其他语言524288K
1.题目大意
- 给定地图中几个点的位置及价值,用爆炸范围为正方形的炸弹炸,求炸到的最大价值
2.题目分析
- 二维前缀和:
- 累加:
m[i][j] += m[i][j-1] + m[i-1][j] - m[i-1][j-1]
- 计算:
ans = max(ans, m[i][j]-m[i-r][j]-m[i][j-r]+m[i-r][j-r])
- 需要注意最大边界的值不得小于半径范围,即初始
mx=r, my=r
3.题目代码
#include <bits/stdc++.h>
using namespace std;
int m[5005][5005];
int main() {
int n, r;
cin >> n >> r;
int x, y, v;
int mx=r, my=r;
for(int i=0;i<n;i++)
{
cin >> x >> y >> v;
x++, y++;
m[x][y] = v;
mx = max(mx, x);
my = max(my, y);
}
for(int i=1;i<=mx;i++)
for(int j=1;j<=my;j++)
m[i][j] += m[i][j-1] + m[i-1][j] - m[i-1][j-1];
int ans = 0;
for(int i=r;i<=mx;i++)
for(int j=r;j<=my;j++)
ans = max(ans, m[i][j]-m[i-r][j]-m[i][j-r]+m[i-r][j-r]);
cout << ans << endl;
}