就是改一下精确覆盖 但还是有不同需要注意的
因为是多重覆盖 DLX萎掉 效率虽然还是很快 但是没有精确覆盖那么神猛了
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline bool read(int &x){
char c=nc(),b=1;
for (;!(c>='0' && c<='9');c=nc()) if (c=='-') b=-1; else if (c==EOF) return 0;
for (x=0;c>='0' && c<='9';x=x*10+c-'0',c=nc()); x*=b; return 1;
}
const int N=505;
const int M=500005;
int ncnt;
int L[M],R[M],U[M],D[M],row[M],col[M];
int size[N];
inline void del(int x){
for(int i=D[x];i!=x;i=D[i])
R[L[i]]=R[i],L[R[i]]=L[i];
}
inline void rec(int x){
for(int i=U[x];i!=x;i=U[i])
R[L[i]]=L[R[i]]=i;
}
bool vst[N];
inline int f(){
int ret=0;
for (int i=R[0];i;i=R[i]) vst[i]=1;
for(int i=R[0];i;i=R[i])
if (vst[i]){
vst[i]=0; ret++;
for(int j=D[i];j!=i;j=D[j])
for(int k=R[j];k!=j;k=R[k])
vst[col[k]]=0;
}
return ret;
}
int ans;
inline void dance(int d=0){
if (d+f()>=ans) return;
if (R[0]==0)
return void(ans=d);
int minv=1<<30,c=0;
for (int i=R[0];i;i=R[i]) if (size[i]<minv) minv=size[i],c=i;
for (int i=D[c];i!=c;i=D[i]){
del(i);
for (int j=R[i];j!=i;j=R[j]) del(j);
dance(d+1);
for (int j=L[i];j!=i;j=L[j]) rec(j);
rec(i);
}
}
int newr;
inline void addline(int n,int *a){
if (!n) return;
int x; ++newr;
for (int j=ncnt+1;j<=ncnt+n;j++){
x=a[j-ncnt]; size[x]++;
row[j]=newr,col[j]=x;
L[j]=j-1,R[j]=j+1;
D[j]=x,U[j]=U[x],D[U[j]]=j,U[D[j]]=j;
}
R[ncnt+n]=ncnt+1; L[ncnt+1]=ncnt+n;
ncnt+=n;
}
int n,m,n1,m1;
int tot,Map[20][20];
int lst[N],pnt;
int main(){
int k,x;
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
while (read(n) && read(m)){
tot=0;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
read(Map[i][j]),Map[i][j]=Map[i][j]?++tot:0;
for (int i=1;i<=tot;i++)
L[i]=i-1,R[i]=i+1,U[i]=D[i]=i,size[i]=0;
L[0]=tot,R[0]=1; R[tot]=0; ncnt=tot; newr=0;
read(n1); read(m1);
for (int i=1;i+n1-1<=n;i++)
for (int j=1;j+m1-1<=m;j++){
pnt=0;
for (int x=i;x<=i+n1-1;x++)
for (int y=j;y<=j+m1-1;y++)
if (Map[x][y])
lst[++pnt]=Map[x][y];
addline(pnt,lst);
}
ans=tot; dance();
printf("%d\n",ans);
}
return 0;
}