SGU P131 Hardwood floor【狀態壓縮】
阿新 • • 發佈:2018-12-14
表示討論到第行並且該行覆蓋狀態為的方案數。
對於所有可以用來覆蓋的地板,顯然只有六種情況,我們分別根據這六種情況一下就好了。
的引數解釋: 當前行,當前列 當前行的狀態,上一行的狀態 對當前行的影響,對上一行的影響:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define ll long long #define rep(i,x,y) for(ll i=(x);i<=(y);i++) #define repl(i,x,y) for(ll i=(x);i<(y);i++) #define repd(i,x,y) for(ll i=(x);i>=(y);i--) using namespace std; const ll N=10; const ll Inf=1e18; ll n,m,all,f[N][1<<N]; inline ll read() { ll x=0;char ch=getchar();bool f=0; while(ch>'9'||ch<'0'){if(ch=='-')f=1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} return f?-x:x; } void dfs(ll row,ll col,ll s1,ll s2,ll ss1,ll ss2) { if(col==m) { if((!ss1)&&(!ss2)) { f[row][s1]+=f[row-1][s2]; } return ; } if(!ss1) { if(!ss2) { dfs(row,col+1,s1<<1|1,s2<<1,0,0); dfs(row,col+1,s1<<1|1,s2<<1,0,1); dfs(row,col+1,s1<<1|1,s2<<1,1,0); } dfs(row,col+1,s1<<1|1,s2<<1|(!ss2),1,0); dfs(row,col+1,s1<<1|1,s2<<1|(!ss2),1,1); } if(!ss2) dfs(row,col+1,s1<<1|ss1,s2<<1,1,1);dfs(row,col+1,s1<<1|ss1,s2<<1|(!ss2),0,0); } int main() { n=read(),m=read();all=(1<<m)-1; f[0][all]=1; rep(i,1,n) dfs(i,0,0,0,0,0); printf("%lld\n",f[n][all]); return 0; }