P2280 [HNOI2003]激光炸弹(二维前缀)C/C++

在这里插入图片描述
在这里插入图片描述
计算二维前缀和
边上的物体是不会受到伤害的,因此可以把每个目标的坐标向右上角平移一位。
举个例子,(0, 0)和(1, 1),原本sum(1, 1)是2的(不符合题意);平移之后变成了(1, 1)和(2, 2),sum(1, 1)变成了1,符合题意

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#include <algorithm>
#include<string.h>
#include<math.h>
#define llu unsigned long long
using namespace std;

int vs[5010][5010];

int main()
{
    
    
	cout << fixed << setprecision(0);
	//cout << setw(8) << setiosflags(ios::left);
	
	int n,m,ans=0;

	cin >> n >> m ;
	
	for(int i=0;i<n;i++)
	{
    
    
		int x,y,v;
		cin >> x >> y >> v ;
		vs[x+1][y+1]=v;
	}
	
	for(int i=1;i<5002;i++)
		for(int j=1;j<5002;j++)
			vs[i][j]=vs[i][j]+vs[i-1][j]+vs[i][j-1]-vs[i-1][j-1];
			
	for(int i=m;i<5002;i++)
		for(int j=m;j<5002;j++)//注意这里画个图就可以看出来
								//求的是边长为m的正方形内的物品价值
			ans=max(ans,vs[i][j]-vs[i-m][j]-vs[i][j-m]+vs[i-m][j-m]);
			
	cout << ans << endl ;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/wangyurenwls/article/details/118548078