题目链接:P2280 [HNOI2003] 激光炸弹 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
笔者答案:
#include<stdio.h>
int s[5005][5005];
int main ()
{int n,m;scanf("%d %d",&n,&m);int i,j;int x,y,v;int max;for(i = 1;i <= n;i ++)//完成价值坐标标记 找出目标范围{scanf("%d %d %d",&x,&y,&v);s[x+1][y+1] += v;}for(i = 1;i <= 5001;i ++)//求二维前缀和数组{for(j = 1;j <= 5001;j ++){s[j][i]+=s[j-1][i]+s[j][i-1]-s[j-1][i-1];}}for(i = 1;i +m-1<= 5001;i ++)//找出最大价值和{for(j = 1;j +m-1 <= 5001;j ++){if(i==1&&j==1)//max初始化{max=s[j+m-1][i+m-1]-s[j-1][i+m-1]-s[j+m-1][i-1]+s[j-1][i-1];}if(s[j+m-1][i+m-1]-s[j-1][i+m-1]-s[j+m-1][i-1]+s[j-1][i-1] > max){max=s[j+m-1][i+m-1]-s[j-1][i+m-1]-s[j+m-1][i-1]+s[j-1][i-1];}}}printf("%d",max);return 0;
}