题意:
给一个矩阵,里面分布着n个星号。
给定一个小矩阵,问最大可以圈进多少个星号。
思路:
dp方程:
dp1[i][j]=dp1[i-1][j]+dp1[i][j-1]-dp1[i-1][j-1]+a[i][j];//代表从(1,1)到(j,i)圈进的星数。
dp2[i][j]=dp1[i][j]-dp1[i-ty][j]-dp1[i][j-tx]+dp1[i-ty][j-tx];//代表以(j,i)为右下角的小矩阵圈进的星数。
没什么陷阱,1A.
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define Max(a,b) ((a)>(b)?(a):(b))
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=105;
const int inf=(1<<30);
int n,m;
int ty,tx;
int a[N][N];
int dp1[N][N];
int dp2[N][N];
void solve()
{
int ans=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp1[i][j]=dp1[i-1][j]+dp1[i][j-1]-dp1[i-1][j-1]+a[i][j];
dp2[i][j]=dp1[i][j]-dp1[i-ty][j]-dp1[i][j-tx]+dp1[i-ty][j-tx];
ans=Max(ans,dp2[i][j]);
}
}
printf("%d\n",ans);
}
int main()
{
int num;
while(scanf("%d",&num),num)
{
memset(a,0,sizeof(a));
memset(dp1,0,sizeof(dp1));
memset(dp2,0,sizeof(dp2));
scanf("%d%d",&m,&n);
int x,y;
for(int i=1;i<=num;i++)
{
scanf("%d%d",&x,&y);
a[y][x]=1;
}
scanf("%d%d",&tx,&ty);
solve();
}
return 0;
}