同样设计出状态后判断是否相容即可
设1为竖放长方形上面一半,0为其他情况
那么状态可转移,当且仅当下面情况
1.两个与运算后值为1,保证上下形成竖放长方形
2.两个 或 运算后0的个数为偶数,保证形成横放长方形
#include<cstdio> #include<cstring> using namespace std; long long dp[10000+10][1<<12]; bool in[1<<20]; int main(){ int n,m; int num; while(scanf("%d%d",&n,&m)&&n){ dp[0][0]=1; for (int i = 0; i < 1 << m; i++) { bool cnt = 0, has_odd = 0; for (int j = 0; j < m; j++) if (i >> j & 1) has_odd |= cnt, cnt = 0;//1^0还是1 else cnt ^= 1; in[i] = has_odd|cnt ? 0 : 1; } // for (int i=0;i < 1<<m;i++) printf("%d ",in[i]); for (int i=1;i<=n;i++){ for (int j=0;j<(1<<m);j++){ dp[i][j]=0; for (int k=0;k<(1<<m);k++){ if((j&k)==0 && in[j|k]){ dp[i][j]+=dp[i-1][k]; } } } } printf("%lld ",dp[n][0]); } return 0; }