POJ 2029 Get Many Persimmon Trees(DP)

题目链接

和求最大子矩阵和,神似。。。宝哥用树状数组做的,数据量挺小的,我直接暴力O(n^2)水过了。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 int p[101][101],o[101][101],map[101][101],key[101][101];
 4 int main()
 5 {
 6     int i,j,x,y,n,m,nu,r,c,max;
 7     while(scanf("%d",&nu)!=EOF)
 8     {
 9         if(!nu) break;
10         memset(p,0,sizeof(p));
11         memset(o,0,sizeof(o));
12         memset(map,0,sizeof(map));
13         memset(key,0,sizeof(key));
14         scanf("%d%d",&n,&m);
15         for(i = 1;i <= nu;i ++)
16         {
17             scanf("%d%d",&x,&y);
18             p[x][y] = 1;
19         }
20         scanf("%d%d",&r,&c);
21         for(i = 1;i <= n;i ++)
22         {
23             for(j = 1;j <= m;j ++)
24             {
25                o[i][j] = o[i][j-1]+p[i][j];
26             }
27         }
28         for(i = 1;i <= n;i ++)
29         {
30             for(j = 1;j <= m;j ++)
31             {
32                 map[i][j] = map[i-1][j]+o[i][j];
33             }
34         }
35         for(i = 1;i <= n;i ++)
36         {
37             for(j = 1;j <= m;j ++)
38             {
39                 if(i-r>=0&&j-c>=0)
40                 {
41                     key[i][j] = map[i][j]+map[i-r][j-c]-map[i-r][j]-map[i][j-c];
42                 }
43             }
44         }
45         max = 0;
46         for(i = 1;i <= n;i ++)
47         {
48             for(j = 1;j <= m;j ++)
49             {
50                 if(max < key[i][j])
51                 max = key[i][j];
52             }
53         }
54         printf("%d\n",max);
55     }
56     return 0;
57 }
posted @ 2012-08-12 19:34  Naix_x  阅读(166)  评论(0编辑  收藏  举报