这是动态规划?我一点思路怎么也没有。最后还是用矩阵部分求和枚举0MS。
题目大意:
给出一个矩阵,上面有几个点。在给一个小点儿的矩阵,求这个矩阵最多能套上几个点。(注意:小矩阵长宽给定,不能旋转)。
解题思路:
建立数组num[i][j]代表点(1,1)到点(i,j)组成的矩阵里有几个点。
下面是代码:
#include <stdio.h>
#include <string.h>
int num[105][105];
int cal(int x1,int y1,int x2,int y2)
{
return num[x2][y2]-num[x2][y1]-num[x1][y2]+num[x1][y1];
}
int max(int a,int b)
{
if(a<b)a=b;
return a;
}
int main()
{
int n,x,y,w,h,c,k;
while(scanf("%d",&n),n)
{
memset(num,0,sizeof(num));
scanf("%d%d",&w,&h);
for(int i=0; i<n; i++)
{
scanf("%d%d",&x,&y);
num[x][y]=1;
}
scanf("%d%d",&c,&k);
for(int i=1; i<=w; i++)
{
int sum=0;
for(int j=1; j<=h; j++)
{
sum+=num[i][j];
if(i!=1)
{
num[i][j]=num[i-1][j];
}
else
{
num[i][j]=0; //这里开始时收残了~~记住要初始化 ,否则就加两倍了~~
}
num[i][j]+=sum;
}
}
int min1=0;
for(int i=0;i+c<=w;i++)
{
for(int j=0;j+k<=h;j++)
{
min1=max(min1,cal(i,j,i+c,j+k));
}
}
printf("%d\n",min1);
}
return 0;
}