01ქვესიმრავლე უბრალოდ მთელი რიცხვია
გადავნომროთ ელემენტები 0..n−1. ქვესიმრავლე n-ბიტიანი რიცხვია: j-ური ბიტი 1-ია, როცა j ელემენტი სიმრავლეშია. 4 ქალაქით 1011₂ = 11 ნიშნავს 1, 2 და 4 ქალაქებს (ბიტები 0, 1, 3).
სიმრავლის ყველა ოპერაცია ერთ პროცესორულ ინსტრუქციად იქცევა:
- j სიმრავლეშია?
mask & (1 << j) - დავამატოთ j:
mask | (1 << j); ამოვიღოთ j:mask & ~(1 << j) - სრული სიმრავლე:
(1 << n) − 1; ყველა ქვესიმრავლე:for mask in 0 .. 2ⁿ−1
ამიტომ mask-ით ინდექსირებული მასივი dp[mask] თითო ქვესიმრავლეზე ერთ პასუხს ინახავს: სულ 2ⁿ. n = 20-ზე ეს დაახლოებით მილიონია, კომფორტული. n = 30-ზე მილიარდია, ზედმეტად ბევრი. ეს ზღვარი გეუბნება, როდის იფიქრო ბიტმასკურ დპ-ზე: შეზღუდვებში n ≤ 20 ან ასე წერია და ამოცანას „რომელი უკვე გამოყენებულია“ უნდა ახსოვდეს.
შენიშვნა: თუ mask′ mask-ს ელემენტს უმატებს, მაშინ mask′ > mask, ამიტომ ზრდადი რიგი შევსების სწორი რიგია.