[SGU223]Little Kings(状压DP)
随便DP一下
Code
#include <cstdio> int sta[150],cnt[150],tp,n,k; long long dp[12][144][150],Ans; int main(){ scanf("%d%d",&n,&k); for(int i=0;i<(1<<n);++i)if(!(i&(i<<1))&&!(i&(i>>1)))sta[++tp]=i; for(int i=1;i<=tp;++i)for(int x=sta[i];x;x&=(x-1),++cnt[i]); for(int i=1;i<=tp;++i)dp[1][cnt[i]][i]=1; for(int i=1;i<n;++i)for(int j=0;j<=k;++j) for(int k=1;k<=tp;++k)if(dp[i][j][k]) for(int x=1;x<=tp;++x) if(!(sta[x]&sta[k])&&!((sta[x]<<1)&sta[k])&&!((sta[x]>>1)&sta[k])) dp[i+1][j+cnt[x]][x]+=dp[i][j][k]; for(int i=1;i<=tp;++i)Ans+=dp[n][k][i]; printf("%lld\n",Ans); }