#include <bits/stdc++.h> using namespace std; struct DLX { const static int maxn=64,maxm=64,maxnode=maxn*maxn; int n,m,sz,anssz; int u[maxnode],d[maxnode],l[maxnode],r[maxnode],row[maxnode],col[maxnode]; //row col 记录该节点i坐标 int h[maxn],colcnt[maxm]; void init(int _n,int _m) //数据位于1,1...n,m { n=_n,m=_m; for(int i=0;i<=m;i++)//1..m是每一列的辅助结点 0代表(0,0)即head { u[i]=d[i]=i; l[i]=i-1;r[i]=i+1; col[i]=i;row[i]=0; colcnt[i]=0; } l[0]=m;r[m]=0; sz=m;anssz=INT_MAX; for(int i=1;i<=n;i++)h[i]=-1; } void push(int x,int y) { // printf("%d %d\n",x,y); colcnt[y]++; col[++sz]=y; row[sz]=x; d[sz]=d[y]; //加入列首元素后面 u[sz]=y; u[d[y]]=sz; d[y]=sz; if(h[x]<0) h[x]=r[sz]=l[sz]=sz; //成为行首元素 else{ int hd=h[x]; //加入行首节点右边 l[sz]=hd; r[sz]=r[hd]; l[r[hd]]=sz; r[hd]=sz; } } void repeat_remove(int x){ for(int i=d[x];i!=x;i=d[i]) l[r[i]]=l[i],r[l[i]]=r[i]; } void repeat_resume(int x){ for(int i=u[x];i!=x;i=u[i]) l[r[i]]=r[l[i]]=i; } int H(){ static bool vis[maxm]; memset(vis,0,sizeof vis); int res=0; for(int i=r[0];i!=0;i=r[i]){ //如果该列未被标标记,则标记该列中每行的列 if(vis[i]) continue; res++;vis[i]=1; for(int j=d[i];j!=i;j=d[j]) for(int k=r[j];k!=j;k=r[k]) vis[col[k]]=1; } return res;//易证res <= ans-dep } void repeat_dance(int dep) { if(r[0]==0){ anssz=min(anssz,dep); return ; } if(dep+H()>=anssz) return ; int cur=r[0]; for(int i=r[0];i!=0;i=r[i]) if(colcnt[i]<colcnt[cur])cur=i; // repeat_remove(cur); for(int i=d[cur];i!=cur;i=d[i]){ repeat_remove(i); for(int j=r[i];j!=i;j=r[j]) repeat_remove(j); repeat_dance(dep+1); for(int j=l[i];j!=i;j=l[j]) repeat_resume(j); repeat_resume(i); } // repeat_resume(cur); } }; DLX dlx; struct point{ double x,y; double dis(const point &a) { return hypot(a.x-x,a.y-y); } }; point city[64],radar[64]; bool le(double a,double b) { if(a<b)return true; } int main() { #ifdef shuaishuai freopen("in.txt","r",stdin); #endif // shuaishuai int n,m;
// 每个子矩阵代表一行 while(~scanf("%d%d",&n,&m)){ static int a[15][15]; int cnt=1; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { scanf("%d",&a[i][j]); if(a[i][j])a[i][j]=cnt++; } int sx,sy; scanf("%d%d",&sx,&sy); dlx.init((n-sx+1)*(m-sy+1),cnt-1); cnt=0; for(int i=0;i+sx<=n;i++) for(int j=0;j+sy<=m;j++) { cnt++; for(int x=i;x<i+sx;x++) for(int y=j;y<j+sy;y++) if(a[x][y])dlx.push(cnt,a[x][y]); } dlx.repeat_dance(0); printf("%d\n",dlx.anssz); } return 0; }