0
点赞
收藏
分享

微信扫一扫

[HNOI2003]激光炸弹

千行 2022-01-13 阅读 62
算法模拟

题目实质让求区间和,很明显的一道二维前缀和问题。

易错点:

1、当构造前缀和数组时,由于数据坐标是从0开始的,又考虑到数组越界问题,需要将所有坐标加一,使处理更加方便。

2、求二维前缀和的公式不用死记硬背,只要画一张图就可以理解。

上代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<algorithm> 
using namespace std;
typedef long long ll;
const ll maxn=5005;
const ll mod=1000000007;
ll n,r,xx,yy,x,y,v,ans,f[maxn][maxn],a[maxn][maxn];
int main(){
	cin>>n>>r;
	for(int i=0;i<n;++i){
		scanf("%lld%lld%lld",&x,&y,&v);
		x++; y++;
		a[x][y]=v;
		xx=max(x,xx); yy=max(y,yy);
	}
	for(int i=1;i<=xx;++i)
		for(int j=1;j<=yy;++j)
			f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
	for(int i=0;i<=xx-r;++i)
		for(int j=0;j<=yy-r;++j)
			ans=max(ans,f[i+r][j+r]-f[i+r][j]-f[i][j+r]+f[i][j]);
	cout<<ans;
	return 0;
} 
举报

相关推荐

0 条评论