HDU2236

分析

题干很简单,每行每列只能选一个,所以想到了状压DP???然后发现压不下来。。。
于是又想到之前的一道将行和列连边的二分图的题,发现这个也可以。
然后就只剩下了怎么求最小值,因为\(n\)的范围较小,所以可以尝试去把所有可能的答案枚举一下,直接枚举显然不可,所以要用到二分答案。
所以就是先求出最大的答案,然后开始逐步缩小,遇到合法的就更新,最后输出。

#include
#include
#include
using namespace std;
const int N=1e2+10;
int g[N][N],n;
int match[N],vis[N];
bool dfs(int x,int l,int r){
    for(int i=1;i<=n;i++){
        if(vis[i]||g[x][i]>r||g[x][i]>1;
            bool is=0;
            for(int i=minn;i+mid<=maxx;i++)
                if(check(i,i+mid)){
                    is=1;break;
                }
            if(is){
                ans=mid;
                r=mid-1;
            }else l=mid+1;
        }
        printf("%d\n",ans);
    }
}

你可能感兴趣的:(HDU2236)