leetcode

Solution to some Leetcode problems written in C++
git clone git://git.dimitrijedobrota.com/leetcode.git
Log | Files | Refs | README | LICENSE

0473.cpp (1648B)


0 // Backtracking: 4 ^ N
1 class Solution {
2 static bool find(const vector<int> &sticks, const int side, int idx, int crnt[4]) {
3 if (idx == size(sticks)) return crnt[0] == side && crnt[1] == side && crnt[2] == side;
5 for (int i = 0; i < 4; i++) {
6 if (crnt[i] + sticks[idx] > side) continue;
8 crnt[i] += sticks[idx];
9 if (find(sticks, side, idx + 1, crnt)) return true;
10 crnt[i] -= sticks[idx];
11 }
13 return false;
14 }
16 public:
17 bool makesquare(vector<int> &sticks) const {
18 const int sum = accumulate(begin(sticks), end(sticks), 0);
19 if (sum % 4 != 0) return false;
21 sort(begin(sticks), end(sticks), greater<>());
22 int crnt[4] = {sticks[0], 0};
23 return find(sticks, sum / 4, 1, crnt);
24 }
25 };
27 // DP: N * 2 ^ N
28 class Solution {
29 uint8_t dp[4][1 << 16] = {0};
31 bool find(const vector<int> &sticks, int left, int side, int crnt, uint16_t mask) {
32 if (dp[left][mask]) return false;
33 dp[left][mask] = 1;
35 if (crnt == side) left--, crnt = 0;
36 if (!left) return true;
38 for (int i = 0, msk = 1; i < size(sticks); i++, msk <<= 1) {
39 if (mask & msk) continue;
40 if (crnt + sticks[i] > side) continue;
41 if (find(sticks, left, side, crnt + sticks[i], mask | msk)) return true;
42 }
44 return false;
45 }
47 public:
48 bool makesquare(vector<int> &sticks) {
49 const int sum = accumulate(begin(sticks), end(sticks), 0);
50 if (sum % 4 != 0) return false;
52 const int side = sum / 4;
53 return find(sticks, 3, side, 0, 0);
54 }
55 };