题目链接:[蓝桥杯 2021 省 AB2] 国际象棋 - 洛谷
标签:状态压缩dp
思路:
设置 f[i][a][b][k] 数组 表示 第 i - 1 行状态为 a ,第 i 行状态为b 的方案数 , 最终方案数为所有
f[m][i][j][k]的和。
从1~m行遍历,首先先遍历第i行的前两行的状态 a b,判断 a b 是否冲突,若冲突,则continue;否则,遍历第i行的状态c,判断c是否与 a b 冲突 , 若冲突 ,则continue;否则,计算第i行放置的棋子个数t,f[i][b][c][j]+=f[i-1][a][b][j-t];(即i-2行状态为a,i-1行状态为b,可以转移到第i行状态为c的情况)。
代码:
#include<iostream>
using namespace std;
const int N = 105, M = 1 << 6 , K = 25, MOD = 1e9+7;
int n,m,k;
int ans;
int f[N][M][M][K];
//f[i][a][b][k] 第i-1行状态为a,第i行状态为b,到此有k个棋子的方案数
//计算二进制x有多少个1
int count(int x)
{
int res=0;
while(x)
{
res++;