40 pts WA,求助
查看原帖
40 pts WA,求助
868864
zjinze楼主2024/4/3 22:40
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=12;
const int M=102;
const int INF=1e18;
int a[M][N],n,m,dp[(1<<N)],digit[N],nxt[N];
signed main(){
	cin>>n>>m;
	for(int i=1;i<(1<<n);i++){
		dp[i]=INF;
	}
	dp[0]=0;
	for(int i=1;i<=m;i++){
        int sum=0;
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
            if(a[i][j]==-1){
                dp[(1<<(n-j))]=1ll;
            }
		}
	}
	for(int i=0;i<(1<<n);i++){
		int tmp=i,tot=0;
		while(tmp){
			digit[++tot]=tmp%2;
			tmp>>=1;
		}
		for(int j=1;j<=m;j++){
			for(int k=n;k>=1;k--)nxt[k]=digit[n-k+1];
			for(int k=1;k<=n;k++){
				if(a[j][k]==1){	
					if(nxt[k]==0){
						nxt[k]=1;
					}
				}
				else if(a[j][k]==-1){
					if(nxt[k]==1){
						nxt[k]=0;
					}
				}
			}
			int sum=0;
			for(int k=1;k<=n;k++){
				sum=(sum<<1)+nxt[k];
			}
            dp[i]=min(dp[i],dp[sum]+1);
            dp[sum]=min(dp[sum],dp[i]+1);
		//	cout<<i<<" "<<sum<<"\n";
		}
		for(int i=1;i<=tot;i++)digit[i]=0;
       // cout<<dp[i]<<"\n";
	}
	if(dp[(1<<n)-1]==INF)	cout<<-1<<"\n";
	else cout<<dp[(1<<n)-1]<<"\n";
	return 0;
}
/*
.in
6
13
0 0 -1 1 0 0 
1 0 0 0 0 -1 
1 -1 0 1 -1 1 
-1 -1 1 -1 -1 -1 
-1 -1 0 -1 0 1 
1 1 -1 0 0 0 
1 1 0 1 0 1 
0 0 0 0 1 -1 
-1 1 -1 0 -1 -1 
1 -1 -1 1 1 1 
-1 0 1 1 -1 0 
-1 0 1 -1 -1 0 
-1 1 -1 0 1 1
.out 
3
*/
/*
.in
3
3
1 -1 1 
0 1 -1 
0 0 1
.out
3
*/
2024/4/3 22:40
加载中...