Get Many Persimmon Trees
题目链接:传送门
题目大意:在给定的w*h面积的土地上,随机种了一些树,给你s*t面积的矩形,让你圈儿出最多树。
类比一维的最长子串儿,这里也要初始化一个数组,记录从map[1][1]到map[x][y]之间的树的数量。
最后遍历每一个s*t大小的矩形。
代码如下:
#include<stdio.h>
#include<string.h>
int a[105][105];
int dp[105][105];
int MAX(int a,int b)
{
if(a>b)
return a;
return b;
}
int main()
{
int n,w,h,s,t;
int x,y;
while(scanf("%d",&n),n)
{
memset(a,0,sizeof(a));
memset(dp,0,sizeof(dp));
scanf("%d%d",&w,&h);
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
a[x][y]=1;
}
scanf("%d%d",&s,&t);
for(int i=1;i<=w;i++) //初始化dp数组
for(int j=1;j<=h;j++)
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+a[i][j];
int ans=0;
for(int i=1;i<=w;i++) //遍历每一个s*t大小的矩形
for(int j=1;j<=h;j++)
{
int ii=i+s-1;
int jj=j+t-1;
if(ii>w || jj>h) continue;
ans=MAX(ans,dp[ii][jj]-dp[i-1][jj]-dp[ii][j-1]+dp[i-1][j-1]);
}
printf("%d\n",ans);
}
return 0;
}