BZOJ1218: [HNOI2003]激光炸弹

来源:互联网 发布:mysql null的逻辑 编辑:程序博客网 时间:2024/05/22 14:32

Description

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

Input

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

Output

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

Sample Input

2 1

0 0 1

1 1 1
Sample Output

1

题目传送门

我的dp弱的要死,所以我在大视野上从来不做dp题
但是不能这样下去啊,学编程有哪个不会dp的啊!!
在学算法的同时,要关注一下这个东西

进入正题

这个dp…好吧我都会打,但没想到这么暴力!!
这和暴力几乎没区别了啊…
看代码吧

代码如下:

#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>using namespace std;int f[5100][5100];int a[11000],b[11000],c[11000];int main(){    memset(f,0,sizeof(f));    int n,m,ans=0;    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)    {        scanf("%d%d%d",&a[i],&b[i],&c[i]);        f[a[i]+1][b[i]+1]+=c[i];    }    for(int i=1;i<=5001;i++)        for(int j=1;j<=5001;j++)            f[i][j]+=f[i-1][j];    for(int i=1;i<=5001;i++)        for(int j=0;j<=5001;j++)            f[i][j]+=f[i][j-1];    for(int i=m;i<=5001;i++)        for(int j=m;j<=5001;j++)            ans=max(ans,f[i][j]+f[i-m][j-m]-f[i-m][j]-f[i][j-m]);    printf("%d\n",ans);    return 0;}

by_lmy

原创粉丝点击