P2280 [HNOI2003]激光炸弹 题解
Believe_R_ · · 题解
早上做到一道 超级毒瘤 的题目!!
传送门:P2280 [HNOI2003]激光炸弹
看到这道题目,算法就很明显地展现在我们眼前:前缀和(只不过是二维的)!【题目已经说得很清楚了,这里就不再重复了】
对于这道题,我们可以开一个二维数组:
这时,我又重新看了一下题目·······
这里的 n 是指目标的个数,但不是这个棋盘的面积!!!
所以上面的代码哪里写错了,就一目了然了~
for(int i=r;i<= /*n*/ 5001;++i)
for(int j=r;j<= /*n*/ 5001;++j)
ans=max(ans,f[i][j]-f[i-r][j]-f[i][j-r]+f[i-r][j-r]);
现在就对了呀(F***)附上c++代码
#include <bits/stdc++.h>
#define M 5100
using namespace std;
int f[M][M];
int n, m, r, ans;
inline int read()
{
int re=0, f=1; char ch=getchar();
while(ch<'0' || ch>'9') {if(ch=='-') f=-1; ch=getchar();}
while(ch>='0' && ch<='9') {re=re*10+(ch-'0'); ch=getchar();}
return re*f;
}
int main()
{
n=read(); r=read();
for(int i=1;i<=n;++i)
{
int x=read(), y=read(), z=read();
f[x+1][y+1]=z;
}
for(int i=1;i<=5001;++i)
for(int j=1;j<=5001;++j)
f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
ans=0;
for(int i=r;i<=5001;++i)
for(int j=r;j<=5001;++j)
ans=max(ans,f[i][j]-f[i-r][j]-f[i][j-r]+f[i-r][j-r]);
printf("%d\n",ans);
return 0;
}