题意:平面上有一些给定的点,用一个给定大小的矩形(不能旋转)来框住最多的点。
思路:预处理出所有左上顶点为(1, 1),右下顶点为(x, y)的矩形里点的数量,用dp[x][y]存储。我也不知道这种方法是不是dp。。。总之,题很水。
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int dp[110][110]; 6 int main() 7 { 8 //freopen("data.in", "r", stdin); 9 int n; 10 while (~scanf("%d",&n) && n) 11 { 12 int w, h; 13 scanf("%d%d",&w,&h); 14 memset(dp, 0, sizeof(dp)); 15 while (n--) 16 { 17 int x, y; 18 scanf("%d%d",&x,&y); 19 dp[x][y] = 1; 20 } 21 for (int i = 1; i <= w; i++) 22 for (int j = 1; j <= h; j++) 23 dp[i][j] += dp[i-1][j] -dp[i-1][j-1] + dp[i][j-1]; 24 int s, t; 25 scanf("%d%d",&s,&t); 26 int res = 0; 27 for (int i = s; i <= w; i++) 28 for (int j = t; j <= h; j++) 29 res = max(res, dp[i][j] - dp[i-s][j] + dp[i-s][j-t] - dp[i][j-t]); 30 printf("%d\n", res); 31 } 32 return 0; 33 }