二维前缀和——激光炸弹 算法进阶指南

二维前缀和——激光炸弹 算法进阶指南_第1张图片

这个题让求在一个二维的图表内,计算边长为R的正方形的总价值

二维前缀和——激光炸弹 算法进阶指南_第2张图片

这个题就是反复对这个思路的运用 首先将每一点的与(0,0)所围成的面积的权重求出来

g[i][j]+=g[i-1][j]+g[i][j-1]-g[i-1][j-1]

然后下一步就是挨个计算面积为R的平方的处在该区域的各个地方的权值。

int res=0;
res=max(res,g[i-R][j]+g[i][j-R]-g[i-R][j-R];

下面是我的代码:

#include
#include

using namespace std;

const int N=5010;
int map[N][N];

int main()
{
    int N,R;
    cin >> N >> R;
    int n = R,m = R;
    for(int i = 0,x,y,w;i < N;i ++ )
    {
        cin>> x >> y >> w;
        x+=1,y+=1;
        map[x][y]+=w;
        n=max(n,x);
        m=max(m,y);
    }
    for(int i = 1;i <= n; i ++ )
        for(int j = 1;j <= m; j ++ )
            map[i][j]+=map[i-1][j]+map[i][j-1]-map[i-1][j-1];
    
    int res = 0;
    for(int i = R;i <= n; i ++ )
        for(int j = R; j <=m; j ++ )
            res=max(res,(map[i][j]-map[i-R][j]-map[i][j-R]+map[i-R][j-R]));
            
    cout<< res <

 

我们一直在努力,欢迎一起交流!

你可能感兴趣的:(算法进阶指南)