为什么加上这句话就错了?
查看原帖
为什么加上这句话就错了?
69796
林聪楼主2021/2/25 20:34

如题,在枚举正方形左上角时,如果加上

if(i+k-1>n2||j+k-1>m2)  break;

这句话,就会WA on test 8。

按理来说矩阵内都是正数,右下角超过矩阵范围应该不会更优了,但是事实却不是这样,求大佬解答。

注:(n1,m1)表示整个矩阵的左上角,(n2,m2)表示整个矩阵的右下角。

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=5e3+5;
int read()
{
  int x=0;
  char c=getchar();
  while(c<'0'||c>'9')  c=getchar();
  while('0'<=c&&c<='9')
  {
  	x=(x<<3)+(x<<1)+c-'0';
  	c=getchar();
  }
  return x;
}
int n1=maxn,m1=maxn,n2,m2,ans;
int s[maxn][maxn];
int main()
{
  int num=read(),k=read();
  while(num--)
  {
  	int x=read()+1,y=read()+1;
  	n1=min(n1,x),m1=min(m1,y);
  	n2=max(n2,x),m2=max(m2,y);
  	s[x][y]=read();
  }
  for(int i=n1;i<=n2;i++)
    for(int j=m1;j<=m2;j++)
      s[i][j]+=s[i-1][j]+s[i][j-1]-s[i-1][j-1];
  for(int i=n1;i<=n2;i++)
    for(int j=m1;j<=m2;j++)
    {
      //if(i+k-1>n2||j+k-1>m2)  break;
      int x1=i,x2=min(n2,i+k-1);
      int y1=j,y2=min(m2,j+k-1);
      ans=max(ans,s[x2][y2]-s[x2][y1-1]-s[x1-1][y2]+s[x1-1][y1-1]);
	}
  printf("%d",ans);
  return 0;
}
2021/2/25 20:34
加载中...