Advertisement
pb_jiang

lc 1931

Jul 16th, 2022
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.02 KB | None | 0 0
  1. class Solution
  2. {
  3.     static const int MOD = 1000 * 1000 * 1000 + 7;
  4.     vector<int> colors;
  5.     void get_colors(int m, int s, vector<int> &v)
  6.     {
  7.         for (int i = 0; i < m; ++i) {
  8.             v[i] = s % 3;
  9.             s = s / 3;
  10.         }
  11.     }
  12.  
  13.   public:
  14.     int colorTheGrid(int m, int n)
  15.     {
  16.         int state_space = pow(3, m);
  17.         vector<vector<int>> dp(n + 1, vector<int>(state_space));
  18.         colors = vector<int>(m);
  19.         for (int i = 0; i < state_space; ++i) {
  20.             get_colors(m, i, colors);
  21.             bool avail = true;
  22.             for (int j = 0; j < m - 1; ++j)
  23.                 if (colors[j] == colors[j + 1])
  24.                     avail = false;
  25.             if (avail)
  26.                 dp[0][i] = 1;
  27.         }
  28.         for (int i = 0; i < n - 1; ++i) {
  29.             for (int j = 0; j < state_space; ++j) {
  30.                 if (dp[i][j] == 0)
  31.                     continue;
  32.                 get_colors(m, j, colors);
  33.                 vector<int> nc(m);
  34.                 for (int k = 0; k < state_space; ++k) {
  35.                     get_colors(m, k, nc);
  36.                     bool ne = (nc != colors);
  37.                     bool state_legal = true;
  38.                     for (int r = 0; r < m; ++r) {
  39.                         if (nc[r] == nc[r + 1])
  40.                             state_legal == false;
  41.                     }
  42.                     if (k == 8) {
  43.                         for (int r = 0; r < m; ++r) {
  44.                             printf("nc[%d]:%d\n", r, nc[r]);
  45.                         }
  46.                         printf("state_legal:%d\n", int(state_legal));
  47.                     }
  48.                     if (ne && state_legal) {
  49.                         printf("from state:%d to %d\n", j, k);
  50.                         dp[i + 1][k] = (dp[i + 1][k] + dp[i][j]) % MOD;
  51.                     }
  52.                 }
  53.             }
  54.         }
  55.         int ret = 0;
  56.         for (int i = 0; i < state_space; ++i) {
  57.             ret = (ret + dp[n - 1][i]) % MOD;
  58.         }
  59.         return ret;
  60.     }
  61. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement