[SCOI2005]互不侵犯King
Posted zzzyc
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SCOI2005]互不侵犯King相关的知识,希望对你有一定的参考价值。
据说这是一道状压DP。。。然而蒟蒻并不太会状压。。。所以此文为现学现卖。。。QVQ
这个题我们只要按正常思维先预存一下。。。
然后枚举一下就可以了。。。好像没有什么思维上的梗。。。
直接上代码好了。。。
呆码:
#include<iostream> #include<cstdio> using namespace std; long long dp[11][110][350]; int f[110],sum[110]; int n,k,top; inline bool check1(int x) { if(x & x<<1) return 0; else return 1; } inline void init() { int maxn=(1<<n)-1; for(int i=0;i<=maxn;i++) if(check1(i)) { f[++top]=i; int t=i; while(t) sum[top]+=t%2,t>>=1; } } int main() { scanf("%d%d",&n,&k); init(); for(int i=1;i<=top;i++) if(sum[i]<=k) dp[1][i][sum[i]]=1; for(int i=2;i<=n;i++) for(int j1=1;j1<=top;j1++) for(int j2=1;j2<=top;j2++) { if(f[j1] & f[j2]) continue; if(f[j1] & f[j2]<<1) continue; if(f[j1]<<1 & f[j2]) continue; for(int j3=1;j3<=k;j3++) if(sum[j1]+j3<=k) dp[i][j1][sum[j1]+j3]+=dp[i-1][j2][j3]; } long long ans=0; for(int i=1;i<=n;i++) for(int j=1;j<=top;j++) ans+=dp[i][j][k]; printf("%lld\\n",ans); }
以上是关于[SCOI2005]互不侵犯King的主要内容,如果未能解决你的问题,请参考以下文章