POJ2029:Get Many Persimmon Trees(DP)
Time Limit: 1000MS | Memory Limit: 30000K | |
Total Submissions: 2821 | Accepted: 1836 |
Description
For example, in Figure 1, the entire field is a rectangular grid whose width and height are 10 and 8 respectively. Each asterisk (*) represents a place of a persimmon tree. If the specified width and height of the estate are 4 and 3 respectively, the area surrounded by the solid line contains the most persimmon trees. Similarly, if the estate's width is 6 and its height is 4, the area surrounded by the dashed line has the most, and if the estate's width and height are 3 and 4 respectively, the area surrounded by the dotted line contains the most persimmon trees. Note that the width and height cannot be swapped; the sizes 4 by 3 and 3 by 4 are different, as shown in Figure 1.
Figure 1: Examples of Rectangular Estates
Your task is to find the estate of a given size (width and height) that contains the largest number of persimmon trees.
Input
N
W H
x1 y1
x2 y2
...
xN yN
S T
N is the number of persimmon trees, which is a positive integer less than 500. W and H are the width and the height of the entire field respectively. You can assume that both W and H are positive integers whose values are less than 100. For each i (1 <= i <= N), xi and yi are coordinates of the i-th persimmon tree in the grid. Note that the origin of each coordinate is 1. You can assume that 1 <= xi <= W and 1 <= yi <= H, and no two trees have the same positions. But you should not assume that the persimmon trees are sorted in some order according to their positions. Lastly, S and T are positive integers of the width and height respectively of the estate given by the lord. You can also assume that 1 <= S <= W and 1 <= T <= H.
The end of the input is indicated by a line that solely contains a zero.
Output
Sample Input
16 10 8 2 2 2 5 2 7 3 3 3 8 4 2 4 5 4 8 6 4 6 7 7 5 7 8 8 1 8 4 9 6 10 3 4 3 8 6 4 1 2 2 1 2 4 3 4 4 2 5 3 6 1 6 2 3 2 0
Sample Output
4 3
Source
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define MAX 110
using namespace std;
int sum[MAX][MAX];
bool map[MAX][MAX];
struct node
{
int x;
int y;
}a[MAX];
void init()
{
memset(sum,0,sizeof(sum));
memset(map,0,sizeof(map));
}
bool cmp(node a,node b)
{
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
int w,h;
int i,j;
init();
scanf("%d%d",&w,&h);
int x,y;
for(i=1;i<=n;i++)
{
//scanf("%d%d",&a[i].y,&a[i].x);
scanf("%d%d",&y,&x);
map[x][y]=1;
}
int s,t;
scanf("%d%d",&s,&t);
for(i=1;i<=h;i++)
{
for(j=1;j<=w;j++)
{
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
if(map[i][j])
sum[i][j]++;
}
}
/*for(i=1;i<=h;i++)
{
for(j=1;j<=w;j++)
cout<<sum[i][j]<<" ";
cout<<endl;
}*/
int ans=0;
for(i=1;i<=h-t+1;i++)
{
for(j=1;j<=w-s+1;j++)
{
int cur_x=i+t-1;
int cur_y=j+s-1;
int res=sum[cur_x][cur_y]-sum[cur_x][j-1]-sum[i-1][cur_y]+sum[i-1][j-1];
if(res>ans)
{
ans=res;
}
}
}
printf("%d\n",ans);
}
}
//16MS
sum[i][j]:表示从(1,1)到(i,j)范围内有多少棵树