原题: http://poj.org/problem?id=2029
思路: 类似求矩阵中 最大子矩阵和, 在合并s行后, 求连续 t 个元素的最大和
#include<cstdio>
#include<memory.h>
int main()
{
int n;
const int size=101;
scanf("%d",&n);
while(n!=0)
{
int dp[size][size]={0};
int w,h;
scanf("%d %d",&w,&h);
for(int i=1;i<=n;i++)
{
int a,b;
scanf("%d %d",&a,&b);
dp[b][a]=1;
}
int i,j;
int s,t;
scanf("%d %d",&t,&s);
int limit=h-s;
int arr[size]={0};
int m=0;
int sum[size]={0};
for(j=1;j<=t;j++)
{
for(i=1;i<=s;i++)//合并s行
{
arr[j]=arr[j]+dp[i][j];
}
sum[j]=sum[j-1]+arr[j];
}
m=sum[t];
for(j=t+1;j<=w;j++)
{
for(i=1;i<=s;i++)//合并s行
{
arr[j]=arr[j]+dp[i][j];
}
sum[j]=sum[j-1]+arr[j];
if(sum[j]-sum[j-t]>m)
{
m=sum[j]-sum[j-t];
}
}
for(int start=1;start<=limit;start++)
{
memset(sum,0,sizeof(sum));
for(j=1;j<=t;j++)
{
arr[j]=arr[j]+dp[s+start][j]-dp[start][j];
sum[j]=sum[j-1]+arr[j];
}
if(sum[t]>m)
{
m=sum[t];
}
for(j=t+1;j<=w;j++)
{
arr[j]=arr[j]+dp[s+start][j]-dp[start][j];
sum[j]=sum[j-1]+arr[j];
if(sum[j]-sum[j-t]>m)
{
m=sum[j]-sum[j-t];
}
}
}
printf("%d\n",m);
scanf("%d",&n);
}
return 0;
}