爆搜出三进制的状态,因为m<=5,所以状态最多为3*(2^5)=48个,然后就可以用一个二维dp来统计答案了。
可以发现给出行上和给出行下的方案数是一样的,设给出行上的方案数为ans1,给出行下的方案数为ans2,答案即为 ans1*ans2。
所以严格意义上不算是状压dp吧,没有用到二进制状压的精髓。
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e4+5,M=50,MOD=1e6;
int n,m,k,cnt,ans1,ans2,ans,id;
int a[M],f[N][M];
bool pd[M][M];
struct number{
int a[M];}num[M];
void dfs(int x,int last)
{
if (x==m+1)
{
cnt++;
for (register int i=1; i<=m; ++i) num[cnt].a[i]=a[i];
return;
}
for (register int i=1; i<=3; ++i)