Sculpture

解题思路
金典状压DPDPDP,设 fif_ifi 表示选取状态为 iii 时的方案总数,枚举上一个选择的数 jjj 进行转移,动态转移方程为:fi=∑j∈infi−1<<jf_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;
}

该博客介绍了一种利用动态规划(DP)解决关于雕塑排列的数学问题。代码中展示了如何通过位运算和状态转移方程找出所有可能的合法排列总数。核心思路在于状态压缩和动态转移,适用于处理具有约束条件的组合计数问题。
393

被折叠的 条评论
为什么被折叠?



