leetcode1931 用三种不同颜色为网格涂色
思路:
状态压缩动态规划,使用了滚动数组优化空间。
实现:
1 class Solution 2 { 3 public: 4 bool check(int x, int y, int M) 5 { 6 for (int i = 0; i < M; i++) 7 { 8 int p = x & 3, q = y & 3; 9 if (p == q) return false; 10 x >>= 2; y >>= 2; 11 } 12 return true; 13 } 14 int colorTheGrid(int m, int n) 15 { 16 int M = min(m, n), N = max(m, n); 17 vector<int> v; 18 int MOD = 1e9 + 7; 19 for (int i = 0; i < 1 << 2 * M; i++) 20 { 21 vector<int> tmp; 22 int s = i; 23 bool flg = true; 24 for (int j = 0; j < M; j++) 25 { 26 if ((s & 3) == 3) { flg = false; break; } 27 tmp.push_back(s & 3); 28 s >>= 2; 29 } 30 if (!flg) continue; 31 for (int j = 0; j < (int)tmp.size() - 1; j++) 32 { 33 if (tmp[j + 1] == tmp[j]) { flg = false; break; } 34 } 35 if (flg) v.push_back(i); 36 } 37 unordered_map<int, vector<int>> mp; 38 for (int i = 0; i < (int)v.size(); i++) 39 { 40 for (int j = i + 1; j < (int)v.size(); j++) 41 { 42 int x = v[i], y = v[j]; 43 if (check(x, y, M)) 44 { 45 if (!mp.count(i)) mp[i] = vector<int>(); 46 mp[i].push_back(j); 47 if (!mp.count(j)) mp[j] = vector<int>(); 48 mp[j].push_back(i); 49 } 50 } 51 } 52 int l = v.size(); 53 vectorint>> dp(2, vector<int>(l, 0)); 54 for (int i = 0; i < l; i++) dp[0][i] = 1; 55 for (int i = 1; i < N; i++) 56 { 57 for (int j = 0; j < l; j++) 58 { 59 dp[i & 1][j] = 0; 60 for (int k = 0; k < (int)mp[j].size(); k++) 61 { 62 int t = mp[j][k]; 63 dp[i & 1][j] = (dp[i & 1][j] + dp[i - 1 & 1][t]) % MOD; 64 } 65 } 66 } 67 int res = 0; 68 for (int i = 0; i < l; i++) res = (res + dp[N - 1 & 1][i]) % MOD; 69 return res; 70 } 71 };