又是一道完全自己想出来的dp题。
题意:一个w*h的图中,有n个点,给一个s*t的圈,求这个圈能 圈的最多的点
分析:d[i][j]代表i行j列 到第一行第一列的这个方框内有多少个点, 然后枚举圈的右下角的点,
计算在圈的范围的点的方法为
d[i][j]-d[i][j-s]-d[i-t][j]+d[i-t][j-s]。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <algorithm> 5 #define LL long long 6 using namespace std; 7 const int maxn = 500 + 10; 8 int d[110][110], G[110][110]; 9 int n, w, h, s, t; 10 11 int main() 12 { 13 int i, j, x, y, sum, ans; 14 while(~scanf("%d", &n) && n) 15 { 16 ans = 0; 17 memset(d, 0, sizeof(d)); 18 memset(G, 0, sizeof(G)); 19 scanf("%d%d", &w, &h); 20 for(i = 1; i <= n; i++) 21 { 22 scanf("%d%d", &x, &y); 23 G[y][x] = 1; 24 } 25 scanf("%d%d", &s, &t); 26 for(i = 1; i <= h; i++) 27 { 28 sum = 0; 29 for(j = 1; j <= w; j++) 30 { 31 if(G[i][j] == 1) 32 sum++; 33 d[i][j] = d[i-1][j] + sum; 34 } 35 } 36 for(i = t; i <= h; i++) 37 for(j = s; j <= w; j++) 38 { 39 ans = max(ans, d[i][j]-d[i][j-s]-d[i-t][j]+d[i-t][j-s]); 40 } 41 printf("%d ", ans); 42 } 43 return 0; 44 }