[SCOI2005]互不侵犯
#include <cstdio> #include <iostream> using namespace std; int n,k,a,b,tot,use[1001]; long long dp[11][1001][101]; long long ans; int sum(int s){ int num=0; while(s){ if(s%2)num++; s/=2; } return num; } int main(){ scanf("%d%d",&n,&k); for(int i=0;i<=(1<<n)-1;i++) if(!(i&(i>>1)))use[++tot]=i; for(int i=1;i<=tot;i++){ dp[1][i][sum(use[i])]=1; } for(int i=2;i<=n;i++){ for(int j=1;j<=tot;j++){ for(int t=1;t<=tot;t++){ a=use[j],b=use[t]; if((a&b)||(a&(b<<1))||(a&(b>>1)))continue; for(int p=sum(a);p<=k;p++){ dp[i][j][p]+=dp[i-1][t][p-sum(a)]; } } } } for(int i=1;i<=tot;i++){ ans+=dp[n][i][k]; } printf("%lld\n",ans); return 0; }
最后别忘了long long哦~
类型题推荐:
如有问题和错误,请各位尽情提出,感激不尽~