3.7.15 · HinglishAlgorithm Paradigms

Bitmask DP — TSP intro

1,777 words8 min readRead in English

3.7.15 · Coding › Algorithm Paradigms


WHY a bitmask?


State aur recurrence (scratch se derive karo)

Hum ise kaise build karte hain? Last step ke baare mein socho. pe khade hone ke liye aur mask visit kar chuke hone ke liye, tumhe zaroor kisi pehle wale city se aana pada hoga jo mask mein bhi hai, , aur jisne mask minus visit kiya tha. Hum saare aise pe minimize karte hain:


Complexity (aur 80/20)

Figure — Bitmask DP — TSP intro

Worked example 1 — 3 cities by hand

Cities . Distances (symmetric): .

Base: dp[001][0] = dp[1][0] = 0.

Step State Compute Yeh step kyun?
1 dp[011][1] dp[001][0]+dist[0][1] = 0+10 = 10 Start se city 1 add karo. mask 011={0,1}, last=1.
2 dp[101][2] dp[001][0]+dist[0][2] = 0+15 = 15 Start se city 2 add karo.
3 dp[111][2] dp[011][1]+dist[1][2] = 10+20 = 30 Sab visited, 1→2 se aaye.
4 dp[111][1] dp[101][2]+dist[2][1] = 15+20 = 35 Sab visited, 2→1 se aaye.
5 Close Start pe wapas jao.
Tour cost = 45.

Dono routes aur ka cost 45 hai (symmetric triangle), toh 45 optimal hai. ✓


Worked example 2 — bits padhna

Maano aur tum dp[mask][3] compute kar rahe ho jahan mask = 1011 (binary) .

  • Yeh step kyun? 1011 ka bit 3 1 hai? 1011 → bits hain (3210)=1011, bit3=1 ✓ toh city 3 endpoint ke roop mein allowed hai.
  • prev = mask & ~(1<<3) = 1011 & 0111 = 0011 .
  • Yeh step kyun? Humein 3 pe prev mein already kisi city se aana pada hoga, toh .
  • dp[11][3] = min( dp[3][0]+dist[0][3], dp[3][1]+dist[1][3] ).

Reference implementation

INF = float('inf')
def tsp(dist):
    n = len(dist)
    dp = [[INF]*n for _ in range(1<<n)]
    dp[1][0] = 0                       # base: at 0, visited {0}
    for mask in range(1<<n):
        for i in range(n):
            if dp[mask][i] == INF:     # unreachable, skip
                continue
            for k in range(n):         # try going to city k next
                if mask & (1<<k):      # already visited -> skip
                    continue
                nm = mask | (1<<k)
                nd = dp[mask][i] + dist[i][k]
                if nd < dp[nm][k]:
                    dp[nm][k] = nd
    full = (1<<n)-1
    return min(dp[full][i] + dist[i][0] for i in range(1,n))

Note: yeh version forward push karta hai (mask → nm); upar wali recurrence backward pull karti hai. Same DP hai, do iteration directions — dono valid hain kyunki masks sirf badhte hain.



Recall Feynman: 12-saal ke bacche ko explain karo

Socho tumhe har dost ke ghar ek baar jaana hai aur kam se kam chalke ghar wapas aana hai. Poora path yaad rakhne ki jagah, tum sirf do cheezein ek sticky note pe likhte ho: kaun se ghar ho chuke hain (tick boxes) aur abhi kis ke ghar khade ho. Agar do alag walks ne tumhe same "tick boxes + current house" pe pahuncha diya, toh ab se dono same hain — toh sirf sasta wala rakho aur doosra phenko. Woh sticky notes bitmask hain. Duplicates phenkna hi reason hai ki yeh fast hai.


Active recall

TSP bitmask DP mein dp[mask][i] kya store karta hai?
City 0 se shuru hone wale, exactly set mask visit karne wale, aur city i pe khatam hone wale (mask mein bit i set) path ki min cost.
Bitmask DP brute force ko kyun beat karta hai?
Yeh saare orderings jo same (visited-set, current-city) pe pahunchte hain unhe ek state mein collapse karta hai, ki jagah deta hai.
Base case kya hai?
dp[1][0] = 0 (sirf city 0 visited, 0 pe khade ho, cost 0); baaki sab .
Transition likho.
dp[mask][i] = min over j in prev of dp[prev][j] + dist[j][i], jahan prev = mask & ~(1<<i).
Final closed-tour answer kaise nikaalte ho?
min over i!=0 of dp[(1<<n)-1][i] + dist[i][0].
City i mask mein hai ya nahi kaise test karte ho?
mask & (1<<i) non-zero hai.
Mask se city i kaise remove karte ho?
mask & ~(1<<i).
Time aur space complexity?
Time , space .
dp[mask][i] valid hone ke liye bit i mask mein set kyun hona chahiye?
"i pe khatam hona" require karta hai ki i visit ho chuka ho; warna state impossible hai aur rehti hai.
Agar cycle ki jagah Hamiltonian path chahiye toh kya badalta hai?
+dist[i][0] return term drop karo; answer ban jaata hai min_i dp[full][i].

Connections

  • Dynamic Programming — state, optimal substructure, overlapping subproblems.
  • Travelling Salesman Problem — woh NP-hard problem jise yeh chhote ke liye exactly solve karta hai.
  • Held-Karp Algorithm — is exact DP ka formal naam.
  • Bit Manipulation — masks, shifts, and-not.
  • Subset Enumeration subsets pe iterate karna.
  • Hamiltonian Path and Cycle — valid tour kya hota hai.
  • Branch and Bound — bade ke liye alternative exact method.

Concept Map

naive

too slow

key insight

encode set as

2^n subsets

defines

peel last edge

justified by

start

full mask return to 0

n 2^n states x n

TSP cheapest tour

n! orderings

Collapse orders into states

State: visited set plus current city

Bitmask integer

dp mask i table

Transition min over prev j

Optimal substructure

Base dp 1 0 = 0

TSP answer

O n^2 2^n