poj 2029 Get Many Persimmon Trees (dp)

题目链接

又是一道完全自己想出来的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\n", ans);
42     }
43     return 0;
44 }

 

posted @ 2014-06-23 15:16  水门  阅读(131)  评论(0编辑  收藏  举报