牛客前缀和题、枚举---[HNOI2003]激光炸弹

[HNOI2003]激光炸弹

二维前缀和问题

  • 每一个点用格子代替
  • 求(0,0)到(i,j)之间的前缀和 :f[i][j]+=f[i-1][j]+f[i][j-1]-f[i-1][j-1];
  • 计算每一个格子的价值:ans=max(ans,f[i][j]-f[i-R][j]-f[i][j-R]+f[i-R][j-R]);

#include<bits/stdc++.h>

using namespace std;

#define maxn 5050
#define inf 0x3f3f3f3f
#define mm(a,x) memset(a,x,sizeof(a))
#define ll long long

int f[maxn][maxn];
int main() {
	int n,R,x,y,v;cin>>n>>R;
	int xx=R,yy=R;
	for(int i=1;i<=n;i++){
		cin>>x>>y>>v;x++,y++;
		f[x][y]=v;
		xx=max(xx,x);
		yy=max(yy,y);
	}
	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];
	int ans=0;
	for(int i=R;i<=xx;i++)
	for(int j=R;j<=yy;j++)
	ans=max(ans,f[i][j]-f[i-R][j]-f[i][j-R]+f[i-R][j-R]);
	cout<<ans<<"
";
	return 0;
}

原文地址:https://www.cnblogs.com/bingers/p/13176037.html