状压 DP。
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define itn int
#define ull unsigned long long
int n,m;
LL dp[1<<11];
int a[105][12];
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
memset(dp,120,sizeof(dp));
LL INF=dp[2];
dp[0]=0;
for(int now=0;now<(1<<n);now++){
for(int i=1;i<=m;i++){
int change=now;
for(int j=1;j<=n;j++){
if(a[i][j]==-1){
if(((change>>(j-1)&1))){
change&=~(1<<(j-1));
}
}
else if(a[i][j]==1){
if(((change>>(j-1))&1)==0){
change|=(1<<(j-1));
}
}
}
dp[change]=min(dp[change],dp[now]+1);
}
}
if(dp[(1<<n)-1]!=INF)cout<<dp[(1<<n)-1];
else cout<<-1;
return 0;
}
hack:
in:
3
3
1 -1 1
0 1 -1
0 0 1
ans:
3