RKS_The_Great

Untitled

Nov 13th, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.10 KB | None | 0 0
  1. public class DominoFill {
  2.  
  3.     /**
  4.      * .....
  5.      * ..234
  6.      * 01
  7.      */
  8.     public static int method1(int R, int C) {
  9.         int[] prev = new int[1 << C];
  10.         prev[(1 << C) - 1] = 1;
  11.  
  12.         for (int r = 0; r < R; r++) {
  13.             for (int c = 0; c < C; c++) {
  14.                 int[] cur = new int[1 << C];
  15.                 for (int mask = 0; mask < 1 << C; mask++) {
  16.                     if ((mask & (1 << c)) != 0) {
  17.                         cur[mask ^ (1 << c)] += prev[mask]; // do nothing
  18.  
  19.                         if (c > 0 && (mask & (1 << (c - 1))) == 0) {
  20.                             cur[mask | (1 << (c - 1))] += prev[mask]; // horizontal
  21.                         }
  22.                     } else {
  23.                         cur[mask | (1 << c)] += prev[mask];  // vertical
  24.                     }
  25.                 }
  26.                 prev = cur;
  27.             }
  28.         }
  29.  
  30.         return prev[(1 << C) - 1];
  31.     }
  32.  
  33.     /**
  34.      * .....
  35.      * ..012
  36.      * 34
  37.      */
  38.     public static int method2(int R, int C) {
  39.         int[] prev = new int[1 << C];
  40.         prev[(1 << C) - 1] = 1;
  41.  
  42.         for (int r = 0; r < R; r++) {
  43.             for (int c = 0; c < C; c++) {
  44.                 int[] cur = new int[1 << C];
  45.                 for (int mask = 0; mask < 1 << C; mask++) {
  46.                     int nmask = (mask << 1) & ((1 << C) - 1);
  47.                     if ((mask & (1 << (C - 1))) != 0) {
  48.                         cur[nmask] += prev[mask]; // do nothing
  49.  
  50.                         if (c > 0 && ((mask & 1) == 0)) {
  51.                             cur[nmask | 3] += prev[mask]; // horizontal
  52.                         }
  53.                     } else {
  54.                         cur[nmask | 1] += prev[mask]; // vertical
  55.                     }
  56.                 }
  57.                 prev = cur;
  58.             }
  59.         }
  60.  
  61.         return prev[(1 << C) - 1];
  62.     }
  63.  
  64.     // random test
  65.     public static void main(String[] args) {
  66.         for (int r = 1; r < 10; r++) {
  67.             for (int c = 1; c < 10; c++) {
  68.                 int res1 = method1(r, c);
  69.                 int res2 = method2(r, c);
  70.                 if (res1 != res2)
  71.                     throw new RuntimeException();
  72.             }
  73.         }
  74.     }
  75.  
  76.     public static int method0(int R, int C) {
  77.         int[][][] dp = new int[R + 1][C][1 << C];
  78.         dp[0][C - 1][(1 << C) - 1] = 1;
  79.  
  80.         for (int r = 1; r <= R; r++) {
  81.             for (int c = 0; c < C; c++) {
  82.                 int[] prev = c > 0 ? dp[r][c - 1] : dp[r - 1][C - 1];
  83.                 for (int mask = 0; mask < 1 << C; mask++) {
  84.                     if ((mask & (1 << c)) != 0) {
  85.                         dp[r][c][mask ^ (1 << c)] += prev[mask]; // do nothing
  86.  
  87.                         if (c > 0 && (mask & (1 << (c - 1))) == 0) {
  88.                             dp[r][c][mask | (1 << (c - 1))] += prev[mask]; // horizontal
  89.                         }
  90.                     } else {
  91.                         dp[r][c][mask | (1 << c)] += prev[mask];  // vertical
  92.                     }
  93.                 }
  94.             }
  95.         }
  96.  
  97.         return dp[R][C - 1][(1 << C) - 1];
  98.     }
  99. }
Add Comment
Please, Sign In to add comment