P2280 [HNOI2003]激光炸弹-动态规划,矩形dp,前缀和,容斥原理

版权声明:原创,勿转 https://blog.csdn.net/qq_42386465/article/details/82774366

这题与其说是前缀和,不如说是容斥原理;

先处理好s[i][j]这个数组,表示以(i,j)为右下角的矩形中的总价值;

之后再来一遍循环,在所有的半径为r的矩阵中求最大值即可;

https://www.luogu.org/problemnew/show/P2280

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int s[5010][5010];
int n,r,ans;
int main()
{
    scanf("%d%d",&n,&r);
    for(int i=1;i<=n;i++){
        int x,y,v;
        scanf("%d%d%d",&x,&y,&v);
        s[x+1][y+1]=v;
    }
    for(int i=1;i<=5001;i++){
        for(int j=1;j<=5001;j++){
            s[i][j]+=s[i][j-1]+s[i-1][j]-s[i-1][j-1];
        }
    }
    /*for(int i=0;i<=5000-r;i++){
        for(int j=0;j<=5000-r;j++){
            ans=max(ans,s[i+r][j+r]-s[i+r][j]-s[i][j+r]+s[i][j]);
        }
    }*/
    for(int i=r;i<=5001;i++){
        for(int j=r;j<=5001;j++){
            ans=max(ans,s[i][j]-s[i-r][j]-s[i][j-r]+s[i-r][j-r]);
        }
    }
    printf("%d",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42386465/article/details/82774366
今日推荐