-DP-前缀和- [BZOJ 1218][HNOI2003]激光炸弹

题目描述

一种新型的激光炸弹,可以摧毁一个边长为R的正方形内的所有的目标。现在地图上有n(N<=10000)个目标,用整数Xi,Yi(其值在[0,5000])表示目标在地图上的位置,每个目标都有一个价值。激光炸弹的投放是通过卫星定位的,但其有一个缺点,就是其爆破范围,即那个边长为R的正方形的边必须和x,y轴平行。若目标位于爆破正方形的边上,该目标将不会被摧毁。

输入格式

输入文件的第一行为正整数n和正整数R,接下来的n行每行有3个正整数,分别表示xi,yi,vi

输出格式

输出文件仅有一个正整数,表示一颗炸弹最多能炸掉地图上总价值为多少的目标(结果不会超过32767)。

输入样例

2 1
0 0 1
1 1 1

输出样例

1

Solution

首先这道题用前缀和预处理一下,然后再用$O(n^2)$的DP来解决。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <cstdio>
#include <cstring>
#define re register
int n , p , q , k , f[5005][5005] = {0}, ans = 0;
inline int max(int a , int b) {
if (a > b) return a;
else return b;
}
int main() {
scanf("%d%d" , &n , &k);
p = q = k;
for (re int i = 1 ; i <= n ; i++) {
int x , y , z;
scanf("%d%d%d" , &x , &y , &z);
x++;
y++;
p = max(x , p);
q = max(y , q);
f[x][y] = z;
}
for (re int i = 1 ; i <= p ; i++) {
for (re int j = 1 ; j <= q ; j++) {
f[i][j] = f[i][j] + f[i][j - 1] + f[i - 1][j] - f[i - 1][j - 1];
}
}
for (re int i = k ; i <= p ; i++) {
for (re int j = k ; j <= q ; j++) {
ans = max(ans , f[i][j] + f[i - k][j - k] - f[i - k][j] - f[i][j - k]);
}
}
printf("%d" , ans);
}
文章作者: RiverFun
文章链接: https://stevebraveman.github.io/blog/2018/10/16/37/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 RiverFun

评论