POJ.2411.Mondriaan's Dream(輪廓線DP)
阿新 • • 發佈:2019-01-02
一道好水的題...還是寫篇部落格吧...(我以為輪廓線DP入門要做兩三個題,結果。。)
題意:求用\(1*2\)的矩形完全覆蓋\(n*m\)的棋盤的方案數。
輪廓線DP入門。
另外可以DFS預處理哪些狀態能轉移到哪些狀態,就不用每次\(2^m\)枚舉了。反正複雜度\(O(nm2^m)\)。
一個程式碼看了半小時還是十分感覺它不對,懷疑自己智商ing=-=。
//388K 16MS #include <cstdio> #include <cstring> #include <algorithm> typedef long long LL; const int N=11; LL f[2][(1<<N)+1]; int main() { int n,m; while(scanf("%d%d",&n,&m),n&&m) { if(n*m&1) {puts("0"); continue;} if(n<m) std::swap(n,m); int lim=(1<<m)-1,p=1; memset(f[p],0,sizeof f[p]); f[p][lim]=1; for(int i=0; i<n; ++i) for(int j=0; j<m; ++j) { p^=1; memset(f[p],0,sizeof f[p]); for(int s=0; s<=lim; ++s) { f[p][s^(1<<j)]+=f[p^1][s]; if(j && s>>j&1 && !((s>>j-1)&1)) f[p][s|(1<<j-1)]+=f[p^1][s]; } } printf("%lld\n",f[p][lim]); } return 0; }