额,这题也能紫?
查看原帖
额,这题也能紫?
658786
STUDENT00楼主2022/10/28 22:27

最淳朴的状压dp,然而却紫了……

#include<bits/stdc++.h>
#define mod 10007
using namespace std;
int n,m,dp[225][1<<15],s[225][1<<15],cnt[225],ans; 
char b[225][225];
void init(){
	for(int i=0;i<(1<<m);i++){
		if(!(i&(i<<1))){
			for(int j=0;j<n;j++){
				bool flag=1;
				for(int k=0;k<m;k++){
					if(b[j][k]=='1'&&!((i>>k)&1)||b[j][k]=='0'&&((i>>k)&1)){
						flag=0;
						break;
					}
				}
				if(flag) s[j][cnt[j]++]=i;
			}
		}
	}
}
int main(){
	scanf("%d%d",&n,&m);
	if(n<m){
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				char c=getchar();
				while(c!='0'&&c!='1'&&c!='.') c=getchar();
				b[j][i]=c;
			}
		}
		swap(n,m);
	}else{
		for(int i=0;i<n;i++) scanf("%s",b[i]);
	}
	init();
	for(int i=0;i<cnt[0];i++) dp[0][i]=1;
	for(int i=1;i<n;i++){
		for(int j=0;j<cnt[i];j++){
			for(int k=0;k<cnt[i-1];k++){
				if(s[i][j]&s[i-1][k]) continue;
				dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
			}
		}
	}
	for(int i=0;i<cnt[n-1];i++) ans=(ans+dp[n-1][i])%mod;
	printf("%d",ans);
	return 0;
}

明日csp,今日夜晚熬夜通宵

2022/10/28 22:27
加载中...