Special Permutations - DP w/ Bitmasks [JS]
Solution: DP w/ Bitmasks
Memoize each dp(mask, prevIndex)
, where
mask
= bitmask which indicates which numbers we have used so farprevIndex
= index of the previous number in the permutation
For each dp(mask, prevIndex)
, go through each number and try each unused number that is valid for the current sequence.
Count the total number of ways.
Time Complexity: O(2^n * n^2)
Space Complexity: O(2^n * n)
var specialPerm = function(nums) {
let n = nums.length, fullMask = (1 << n) - 1;
let memo = Array(1 << n).fill(0).map(() => Array(n).fill(-1)), MOD = 10 ** 9 + 7, res = 0;
for (let i = 0; i < n; i++) {
res = (res + dp(1 << i, i)) % MOD;
}
return res;
function dp(mask, prevIndex) {
if (mask === fullMask) return 1;
if (memo[mask][prevIndex] !== -1) return memo[mask][prevIndex];
let ans = 0;
for (let i = 0; i < n; i++) {
if ((mask >> i) & 1) continue;
if ((nums[i] % nums[prevIndex] === 0) || (nums[prevIndex] % nums[i] === 0)) {
let newMask = mask | (1 << i);
ans = (ans + dp(newMask, i)) % MOD;
}
}
return memo[mask][prevIndex] = ans;
}
};
Comments
Post a Comment