蒟蒻求助,麻烦DALAO看看状压哪里写错了
查看原帖
蒟蒻求助,麻烦DALAO看看状压哪里写错了
283894
Ang_QwQ楼主2022/8/15 16:47
#include<iostream>
#include<cstring>
using namespace std;
int f[13][5000],cnt=0,num[5000],st[100010];//f[i][s]表示第i行以s的方式摆的方案总数 
int n,m,gr[14];//gr是每行草地的状态   m是列,n是行 

//st[]负责存储互不相邻的奶牛状态 
//cnt是合法的状态数量 
int main(){
	cin>>m>>n; 
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			int a;
			cin>>a;
			gr[i]=(gr[i]<<1)+a;
		}
	}
	for(int s=0;s<(1<<n);s++){
		if(!(s<<1&s)&&!(s>>1&s)){
			st[++cnt]=s; 
		}
	}
//	for(int i=0;i<=cnt;i++) cout<<st[i]<<" ";
//	cout<<endl;
	f[0][0]=1;
	for(int i=1;i<=m;i++){
		for(int l=1;l<=cnt;l++){
			int s1=st[l];//当前行的状态 
			if((s1&gr[i])==s1) //可以种植 
			for(int r=1;r<=cnt;r++){
				int s2=st[r];
				if((s1&s2)==0){//上下不重合 
					f[i][s1]+=f[i-1][s2];		
				}
			}
		}
	}
	long long ans=0;
	for(int i=1;i<=cnt;i++){
		ans+=f[n][st[i]];
	}
	cout<<ans;
}
2022/8/15 16:47
加载中...