P1369 矩形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这个我用的类似暴力。
首先开个二维数组来存储点的数据给对应的点附上一,然后使用二维前缀和来计算前缀和。
别忘记求的要是边上的点最多,所以减去内部的和。
import java.security.cert.CollectionCertStoreParameters;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main{
public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
int a=sc.nextInt();
int[][] b=new int[500][500];
int[][] bb=new int[500][500];
int c,d,e=0,f=0;
while(a>0) {
a--;
c=sc.nextInt();
d=sc.nextInt();
b[c][d]=1;
e=Math.max(e, c);
f=Math.max(f, d);
}
for(c=1;c<=e;c++) {
for(d=1;d<=f;d++) {
bb[c][d]=bb[c-1][d]+bb[c][d-1]+b[c][d]-bb[c-1][d-1];
}
}
int g,h,m,n,x=0,y;
for(g=1;g<=e;g++) {
for(h=1;h<=f;h++) {
for(m=g;m<=e;m++) {
for(n=h;n<=f;n++) {
y=(bb[m][n]-bb[g-1][n]-bb[m][h-1]+bb[g-1][h-1])-(bb[m-1][n-1]-bb[g][n-1]-bb[m-1][h]+bb[g][h]);
x=Math.max(x, y);
}
}
}
}
System.out.println(x);
}
}