Number of Squareful Arrays - DP w/ Bitmasks [JS]
Solution: DP w/ Bitmasks
mask = bitmask of numbers we have taken in nums
prevNum is the last number in the current permuation
- Go through every
nums[i]
whereprevNum + nums[i]
is a perfect square - Count the number of permuations that are successful
var numSquarefulPerms = function(nums) {
let n = nums.length, allUsed = (1 << n) - 1;
let memo = new Map(), res = 0, used = new Set();
for (let i = 0; i < n; i++) {
if (used.has(nums[i])) continue;
res += dp(1 << i, nums[i]);
used.add(nums[i]);
}
return res;
function dp(mask, prevNum) {
if (mask === allUsed) return 1;
let key = `${mask},${prevNum}`;
if (memo.has(key)) return memo.get(key);
let ans = 0, used = new Set();
for (let i = 0; i < n; i++) {
if ((mask >> i) & 1) continue; // have already used nums[i]
if (used.has(nums[i])) continue; // already used this number at this level
if (!isPerfectSquare(prevNum + nums[i])) continue;
let newMask = mask | (1 << i);
ans += dp(newMask, nums[i]);
used.add(nums[i]);
}
memo.set(key, ans);
return ans;
}
};
Comments
Post a Comment