萌新刚学状压不知道哪里错了,求大佬救
查看原帖
萌新刚学状压不知道哪里错了,求大佬救
156059
xeri_chen楼主2021/10/21 13:49
#include<bits/stdc++.h>

using namespace std;
const int N=30,M=1<<20,P=100000000;

int a[N];
int dp[N][N],n,m;
int s[N][M],top[N];

void build(int a,int* s,int& top)
{
	for(int i=0;i<(1<<m);i++)
	{
		if((i&(i<<1))||(i&a)!=i) continue;
		s[top++]=i;	
	}
}

int main()
{
	bool x;
	cin>>n>>m;
	for(int i=0;i<n;i++) 
		for(int j=0;j<m;j++)
		{
			scanf("%d",&x);
			a[i]=(a[i]<<1)+x;
		} 
		
	for(int i=0;i<n;i++) build(a[i],s[i],top[i]);
		
	for(int j=0;j<top[0];j++) dp[0][j]=1;
	for(int i=1;i<n;i++)
		for(int j=0;j<top[i];j++)
			for(int k=0;k<top[i-1];k++)
				if(!(s[i][j]&s[i-1][k])) 
				{
					dp[i][j]+=dp[i-1][k];
					dp[i][j]%=P;	
				}
				
	int ans=0;			
	for(int j=0;j<top[n-1];j++)		
		ans=(ans+dp[n-1][j])%P;
	cout<<ans;
	return 0;
}
2021/10/21 13:49
加载中...