1. 程式人生 > >bzoj-1248-二維陣列字首和

bzoj-1248-二維陣列字首和

這個題主要利用了二維陣列的字首和來求每一個R*R區域內的值。

這裡座標加一處理是為了後面的求字首和的時候減一操作不至於越界。

還有一點要注意的是f[i][j]表示的是包含邊上的目標的值。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#pragma GCC optimize(2)
#define INF 0x3f3f3f3f

using namespace std;

const int maxn=5000;
int f[maxn+5][maxn+5];
int x,y,z,n,r;

int main()
{
    while(scanf("%d%d",&n,&r)!=EOF)
    {
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d",&x,&y,&z);
            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];
        int 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;
}