记录编号 377092 评测结果 AAAAAAAAAA
题目名称 [POJ2411] Mondriaan's Dream 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.120 s
提交时间 2017-02-28 20:15:25 内存使用 0.43 MiB
显示代码纯文本
  1. #include <cstdio>
  2. #include <cstring>
  3. #define file(x) "examfive." #x
  4. const int N = 12, V = 1 << 11 | 1;
  5. typedef long long ll;
  6. int n, m;
  7. ll f[N][V], fr;
  8. inline int set(int x, int p, int v) {
  9. if (v) return x | (1 << p - 1);
  10. else return x & ~(1 << p - 1);
  11. }
  12. inline int get(int x, int p) {return x >>(p - 1)&1;}
  13. void print(int x) {for (int i = 1; i <= m;i++, x>>=1) printf("%d", x&1);}
  14. void dfs(int r, int c, int s0, int s1) {
  15. // print(s0), putchar('\t'), print(s1), putchar('\n');
  16. if (c > m) {
  17. f[r + 1][s1] += fr;
  18. return;
  19. }
  20. if (get(s0, c) && get(s0, c + 1)) dfs(r, c + 2, s0, set(set(s1, c, 1), c + 1, 1));
  21. if (!get(s0, c)) dfs(r, c + 1, set(s0, c, 1), set(s1, c, 1));
  22. else dfs(r, c + 1, s0, s1);
  23. }
  24. void init(int c, int s) {
  25. if (c > m) f[1][s] = 1;
  26. else {
  27. if (c + 1 <= m) init(c + 2, set(set(s, c, 1), c + 1, 1));
  28. init(c + 1, s);
  29. }
  30. }
  31. int main() {
  32. // freopen("input", "r", stdin);
  33. freopen(file(in), "r", stdin);
  34. freopen(file(out), "w", stdout);
  35. while (scanf("%d%d", &n, &m)){
  36. if (n == 0 && m == 0) break;
  37. memset(f, 0, sizeof(f));
  38. init(1, 0);
  39. for (int i = 1; i < n; i++)
  40. for (int j = 0; j < 1 << m; j++)
  41. if (f[i][j]) fr = f[i][j], dfs(i, 1, j, 0);
  42. printf("%lld\n", f[n][(1 << m) - 1]);
  43. }
  44. }