PKU 2411 Mondriaan's Dream 状态DP

以前做过这题,今天又写了一次,突然发现写了一个好漂亮的DFS……(是不是太自恋了 - -#)

代码:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 
 5 using namespace std;
 6 
 7 typedef __int64 ll;
 8 
 9 int n, m;
10 ll dp[12][1<<11];
11 
12 void dfs(int turn, int now, int next, int cnt) {
13     if (cnt > n) return ;
14     if (cnt==n) {
15         dp[turn+1][next] += dp[turn][now];
16         return ;
17     }
18     if (!(now&(1<<cnt))) { //如果cnt格没放,那就必须放
19         dfs(turn, now, next|(1<<cnt), cnt+1); //放一个竖着的
20         if (!(now&(1<<(cnt+1))) && (cnt<n-1)) dfs(turn, now, next, cnt+2); //放一个横着的
21     } else dfs(turn, now, next, cnt+1); //如果这格被上一层的占了,那这一格就不能放任何东西
22 }
23 
24 int main() {
25     #ifdef Phantom01
26         freopen("PKU2411.txt", "r", stdin);
27     #endif // Phantom01
28 
29     while (scanf("%d%d", &n, &m)!=EOF) {
30         if (n==0&&m==0) return 0;
31 
32         if ((n*m)&1) {
33             puts("0");
34             continue;
35         }
36         memset(dp, 0, sizeof(dp));
37         dp[0][0] = 1;
38         for (int i = 0; i < m; i++)
39             for (int j = 0; j < (1<<n); j++) if (dp[i][j])
40                 dfs(i, j, 0, 0);
41         printf("%I64d\n", dp[m][0]);
42     }
43 }
PKU2411

 

posted @ 2014-04-26 19:16  Phantom01  阅读(137)  评论(0编辑  收藏  举报