蓝桥杯18模拟F
结果填空:铺瓷砖
跟算法竞赛进阶指南的位运算一题几乎一样。
状态压缩+DP+DFS
DP[i][j]为前i行状态为j的方案数
code:
#include <iostream>
using namespace std;
typedef long long ll;
const int N = (1 << 10);
ll dp[12][1 << 11];
void dfs(int row, int column, int now, int pre_state)
{
if(column == 10){
dp[row + 1][now] += dp[row][pre_state];
return;
}
if(((1<<column) & pre_state)) //此位置铺了
dfs(row, column + 1, now, pre_state);
if(!((1<<column) & pre_state)) //此位置铺了竖着的
dfs(row, column + 1, now ^ (1<<column), pre_state);
if(column<=8 && !((1<<column)&pre_state) && !((1<<(column+1))&pre_state)) ////此位置和后面的位置都没有铺砖 铺一块横着的砖
{
dfs(row, column + 2, now, pre_state);
}
}
int main()
{
dp[1][0] = 1;
for(int k = 1; k <= 10; ++k)
for(int j = 0; j < N; ++j)
if(dp[k][j])
dfs(k, 0, 0, j);
cout<<dp[11][0];
}