一道思维难度不大的状态压缩,也并不卡常,但细节处理要格外注意;
f[i][j]表示前i行最后一行状态是j的方案数
#include <bits/stdc++.h> #define p 100000000 using namespace std; int n,m; int a[20][20]; int shu[20]; long long f[15][5010]; int main() { cin>>n>>m; for(register int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",&a[i][j]); } } for(register int i=1;i<=n;i++){ long long tmp=0; for(int j=1;j<=m;j++){ tmp=tmp*2; tmp+=a[i][j]; } shu[i]=tmp; } int tot=(1<<m)-1; f[0][0]=1; for(register int i=1;i<=n;i++){ long long sum=0; for(register int j=0;j<=tot;j++){ if((j&shu[i])!=j) continue; if((j&(j<<1))||(j&(j>>1))) continue; for(register int k=0;k<=tot;k++){ if((k&j)==0) f[i][j]=(f[i][j]+f[i-1][k])%p; } } } long long ans=0; for(int i=0;i<=tot;i++){ ans=(ans+f[n][i])%p; } cout<<ans; }