[SCOI2005]互不侵犯 (狀壓$dp$)
阿新 • • 發佈:2018-10-16
+= n) esp lin sum else bits 記憶化 fin
題目鏈接
Solution
狀壓 \(dp\) .
\(f[i][j][k]\) 代表前 \(i\) 列中 , 已經安置 \(j\) 位國王,且最後一位狀態為 \(k\) .
然後就可以很輕松的轉移了...
記憶化搜索還是不夠啊... 只能會正向 \(dp\) .
Code
#include<bits/stdc++.h> #define ll long long using namespace std; ll f[10][101][1100],n,K; ll js[1100],sum,ans; int main() { cin>>n>>K; sum=(1<<n)-1; for(ll i=0;i<=sum;i++) for(ll j=0;j<n;j++) if(i&(1<<j))js[i]++; for(ll i=0;i<=sum;i++) if((i<<1&i))continue; else f[1][js[i]][i]=1; for(ll i=1;i<n;i++) for(ll j=0;j<=K;j++) for(ll k=0;k<=sum;k++) { if(!f[i][j][k])continue; for(ll kk=0;kk<=sum;kk++) { if((kk<<1&kk))continue; if((k&kk)||((k>>1)&kk)||((k<<1)&kk))continue; if(j+js[kk]>K)continue; f[i+1][j+js[kk]][kk]+=f[i][j][k]; } } for(ll i=0;i<=sum;i++) ans+=f[n][K][i]; cout<<ans<<endl; }
[SCOI2005]互不侵犯 (狀壓$dp$)