← Recursion & DP

Micro-Drill #176 — Bitmask DP template

Recursion & DP Target: 15s

Bitmask DP: represent subset as integer, each bit = included/excluded. O(2^n * n). For n ≤ 20.

def bitmaskDP(n, cost):
    # dp[mask] = best answer using subset 'mask'
    dp = [float('inf')] * (1 << n)
    dp[0] = 0
    for mask in range(1 << n):
        if dp[mask] == float('inf'): continue
        for i in range(n):
            if mask & (1 << i): continue  # already used
            new_mask = mask | (1 << i)
            bits = bin(mask).count('1')  # position = items used so far
            dp[new_mask] = min(dp[new_mask],
                               dp[mask] + cost[bits][i])
    return dp[(1 << n) - 1]

Type it from memory. Go.

Practice Problems

← Micro #175 Micro #177 →