码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1218: [HNOI2003]激光炸弹(DP二维前缀和)

时间:2018-03-10 12:09:16      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:mem   include   bzoj1218   范围   online   前缀和   lib   ++   names   

1218: [HNOI2003]激光炸弹

题目:传送门


 

题解:

   一道经典题目啊...

   为了更好的操作...把整个坐标系向右上角移动,从(1,1)开始

   那么f[i][j]统计一下以(i,j)作为右上角,以(1,1)作为左下角所组成的矩阵里面的价值和

   不难发现,爆炸范围为R*R,且刚好在边上的点不会被摧毁,那么有效矩阵的四条边上肯定就只有R个点

   那么ans=max(ans,f[i][j]+f[i-r][j-r]-f[i][j-r]-f[i-r][j]);

 


代码:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<cstdlib>
 4 #include<cmath>
 5 #include<algorithm>
 6 using namespace std;
 7 int f[5100][5100];
 8 int main()
 9 {
10     memset(f,0,sizeof(f));
11     int n,r,x,y,v;scanf("%d%d",&n,&r);
12     for(int i=1;i<=n;i++)scanf("%d%d%d",&x,&y,&v),f[x+1][y+1]+=v;
13     for(int i=1;i<=5001;i++)
14         for(int j=1;j<=5001;j++)f[i][j]+=f[i-1][j];
15     for(int i=1;i<=5001;i++)
16         for(int j=1;j<=5001;j++)f[i][j]+=f[i][j-1];
17     int ans=0;
18     for(int i=r;i<=5001;i++)for(int j=r;j<=5001;j++)
19         ans=max(ans,f[i][j]+f[i-r][j-r]-f[i][j-r]-f[i-r][j]);
20     printf("%d\n",ans);
21     return 0;
22 }

 

bzoj1218: [HNOI2003]激光炸弹(DP二维前缀和)

标签:mem   include   bzoj1218   范围   online   前缀和   lib   ++   names   

原文地址:https://www.cnblogs.com/CHerish_OI/p/8537374.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!