标签:include spl lin names click col alt isp iostream
据说这是一道状压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); }
标签:include spl lin names click col alt isp iostream
原文地址:https://www.cnblogs.com/zzzyc/p/8969212.html