zoukankan      html  css  js  c++  java
  • FZU 1686 龙之谜 重复覆盖

    兑换0,1模型,如。注意,数据的范围


    #include <stdio.h>
    #include <string.h>
    #include <iostream>
    #include <algorithm>
    #include <vector>
    #include <queue>
    #include <set>
    #include <map>
    #include <string>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    #include <assert.h>
    using namespace std;
    const int MaxM = 500;
    const int MaxN = 500;
    const int maxnode = MaxM*MaxN;
    int K,n,m;
    struct DLX
    {
    	int n,m,size;
    	int U[maxnode],D[maxnode],R[maxnode],L[maxnode],Row[maxnode],Col[maxnode];
    	int H[MaxN],S[MaxM];
    	int ands,ans[MaxN];
    	void init(int _n,int _m)
    	{
    	    ands=0x3f3f3f3f;
    		n = _n;
    		m = _m;
    		for(int i = 0;i <= m;i++)
    		{
    			S[i] = 0;
    			U[i] = D[i] = i;
    			L[i] = i-1;
    			R[i] = i+1;
    		}
    		R[m] = 0; L[0] = m;
    		size = m;
    		for(int i = 1;i <= n;i++)
    			H[i] = -1;
    	}
    	void Link(int r,int c)
    	{
    		++S[Col[++size]=c];
    		Row[size] = r;
    		D[size] = D[c];
    		U[D[c]] = size;
    		U[size] = c;
    		D[c] = size;
    		if(H[r] < 0)H[r] = L[size] = R[size] = size;
    		else
    		{
    			R[size] = R[H[r]];
    			L[R[H[r]]] = size;
    			L[size] = H[r];
    			R[H[r]] = size;
    		}
    	}
    	void remove(int c)
    	{
    		for(int i = D[c];i != c;i = D[i])
    			L[R[i]] = L[i], R[L[i]] = R[i];
    	}
    	void resume(int c)
    	{
    		for(int i = U[c];i != c;i = U[i])
    			L[R[i]]=R[L[i]]=i;
    	}
    	bool v[maxnode];
    	int f()
    	{
    		int ret = 0;
    		for(int c = R[0];c != 0;c = R[c])v[c] = true;
    		for(int c = R[0];c != 0;c = R[c])
    			if(v[c])
    			{
    				ret++;
    				v[c] = false;
    				for(int i = D[c];i != c;i = D[i])
    					for(int j = R[i];j != i;j = R[j])
    						v[Col[j]] = false;
    			}
    		return ret;
    	}
    	void Dance(int d)
    	{
    	    if(d+f()>=ands) return;
    		if(R[0] == 0) {ands=min(ands,d);return;}
    		int c = R[0];
    		for(int i = R[0];i != 0;i = R[i])
    			if(S[i] < S[c])
    				c = i;
    		for(int i = D[c];i != c;i = D[i])
    		{
    			remove(i);
    			for(int j = R[i];j != i;j = R[j])remove(j);
    			Dance(d+1);
    			for(int j = L[i];j != i;j = L[j])resume(j);
    			resume(i);
    		}
    	}
    }g;
    int mp[20][20],sa,sb,id[20][20];
    int main()
    {
        while(~scanf("%d%d",&n,&m))
        {
            int tot=0;
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    scanf("%d",&mp[i][j]);
                    if(mp[i][j]) id[i][j]=++tot;
                }
            }
            scanf("%d%d",&sa,&sb);
            g.init(n*m,tot);
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    for(int ii=i,cnt=1;cnt<=sa&&ii<n;ii++,cnt++)
                    {
                        for(int jj=j,cnt2=1;cnt2<=sb&&jj<m;jj++,cnt2++)
                        {
                            if(mp[ii][jj])
                            {
                                g.Link(i*m+j+1,id[ii][jj]);
                            }
                        }
                    }
                }
            }
            g.Dance(0);
            printf("%d
    ",g.ands);
        }
        return 0;
    }


    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    计算机中最重要的两个硬件是什么它们如何相互作用。
    音乐光盘
    下列各项包含多少位?
    下列包含多少字节?
    自测题‘
    自测题.
    python 并发编程多线程之进程池/线程池
    python 并发编程之多线程
    基于解决高并发生的产者消费者模型
    守护进程、互斥锁、进程间通信(IPC机制)
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4793675.html
Copyright © 2011-2022 走看看