原题链接:https://vjudge.net/problem/UVA-1252
分类:状压DP
备注:集合的应用
#include<bits/stdc++.h>
using namespace std;
int m,n,sta[130],cnt[(1<<11)+5][(1<<11)+5],dp[(1<<11)+5][(1<<11)+5];
char c[15];
int d(int s,int a){
if(dp[s][a]!=-1)return dp[s][a];
if(cnt[s][a]==1)return dp[s][a]=0;
dp[s][a]=m;
for(int i=0;i<m;++i)if(!(s&(1<<i)))
dp[s][a]=min(dp[s][a],max(d(s|(1<<i),a|(1<<i)),d(s|(1<<i),a))+1);
return dp[s][a];
}
int main(void){
// freopen("in.txt","r",stdin);
while(~scanf("%d%d",&m,&n)&&(m||n)){
memset(dp,-1,sizeof(dp));
memset(sta,0,sizeof(sta));
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;++i){
scanf("%s",c);
for(int j=0;j<m;++j)if(c[j]=='1')
sta[i]|=(1<<j);
}
for(int i=0;i<(1<<m);++i)
for(int j=0;j<n;++j)
++cnt[i][i&sta[j]];
printf("%d\n",d(0,0));
}
return 0;
}