题目链接
题解:设dp[i][j] 表示 第 i 行 为 j 状态的方案数,这个j状态是受上一行摆放情况的影响而来的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = (1 << 11), N = (1 << 10);
ll dp[12][M];
void dfs(int cur, int i, int now, int pre){
if(i == 10){
dp[cur + 1][now] += dp[cur][pre];
return;
}
//此位置以及铺了转
if(((1<<i) & pre))
dfs(cur, i + 1, now, pre);
//没有铺,竖着铺一块(1 * 2) 的砖
if(!((1<<i) & pre))
dfs(cur, i + 1, now ^ (1<<i), pre);
//此位置和后面的位置都没有铺砖 铺一块(2 * 1)的砖
if(i<=8 && !((1<<i)&pre) && !((1<<(i+1))&pre)){
dfs(cur, i + 2, now, pre);
}
}
int main()
{
dp[1][0] = 1;
for(int i = 1; i <= 10; ++i)
for(int j = 0; j < N; ++j)
if(dp[i][j])
dfs(i, 0, 0, j);
printf("%lld\n",dp[11][0]);
}