题目传送门
这道题呢,我们用二维前缀和来解决,
求矩形边界最多的点的个数
思路是:枚举所有矩形,求出各自的边界上点的个数,然后打擂台求出最大值
1. 如何找出所有矩形
2. 怎么求出矩形边界上点的个数
3. 如何求出矩形区域内点的个数
Ans 1:枚举出左上角位置,右下角位置
for(xa)
{
for(ya) //(xa,ya) 左上角
{
for(xb)
{
for(yb) //(xb,yb) 右上角
{
}
}
}
}
Ans 2:
矩形区域内的点的总数 - 里面的矩形区域的点的点数
Ans 3:
有点的位置 - 1 没有 - 0
矩形区域总和 = 矩形区域内的点的总数
二维前缀和
(xa,ya)(xb,yb) (xa+1,ya+1) (xa-1,ya-1)\
整体思路大概就是这样:
上AC代码:
#include <bits/stdc++.h>
using namespace std;
const int N=1005;
int a[N][N],s[N][N];
int sumSub(int xa,int ya,int xb,int yb)
{
return s[xb][yb]-s[xb][ya-1]-s[xa-1][yb]+s[xa-1][ya-1];
}
int main()
{
int n,x,y;
cin>>n;
int maxs=1;
for(int i=1;i<=n;i++)
{
cin>>x>>y;
a[x][y]=1;
}
for(int i=1;i<=100;i++)
{
for(int j=1;j<=100;j++)
{
s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];
}
}
for(int xa=1;xa<=100;xa++)
{
for(int ya=1;ya<=100;ya++)
{//左上角位置(xa,ya)
for(int xb=xa+1;xb<=100;xb++)
{
for(int yb=ya+1;yb<=100;yb++)
{//右下角 (xb,yb) (xa,ya)(xb,yb) (xa+1,ya+1)(xb-1,yb-1)
maxs=max(maxs,sumSub(xa,ya,xb,yb)-sumSub(xa+1,ya+1,xb-1,yb- 1));
}
}
}
}
cout<<maxs;
return 0;
}
这是AC的昂,如果有运行了报错的话,可能是编译器不一样,或者是别的某方面原因哈