Sculpture
解题思路
金典状压 D P DP DP,设 f i f_i fi 表示选取状态为 i i i 时的方案总数,枚举上一个选择的数 j j j 进行转移,动态转移方程为: f i = ∑ j ∈ i n f i − 1 < < j f_i=\sum^{n}_{j\in i}f_{i-1<<j} fi=j∈i∑nfi−1<<j\
code
#include<iostream>
#include<cstdio>
#define int long long
using namespace std;
int n,m;
int f[1<<21];
int a[30][30];
int g(int i)
{
int s=0;
while(i)
s+=i&1,i>>=1;
return s;
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%lld%lld",&x,&y);
a[x][y]=1;
}
f[0]=1;
for(int i=0;i<(1<<n);i++)
for(int j=0;j<n;j++)
if(i&(1<<j)&&!a[g(i)][j+1])
f[i]+=f[i-(1<<j)];
cout<<f[(1<<n)-1]<<endl;
}