/>

Lesson 2 — Beginner

DP Patterns: Fibonacci se Knapsack tak

DP problems solve karne ka sabse easy tareeka hai pattern recognition. Agar tumhe 5-6 common patterns aate hain toh interview mein 80% DP problems pehchaan sakte ho. Is lesson mein hum Fibonacci, Climbing Stairs, House Robber, Coin Change, aur Grid Paths jaise patterns dekhenge. Har pattern ka template yaad karlo — problem aayegi toh seedha lagaa doge.

⏱ 30 min• Beginner• DP Basics

Pattern 1: Fibonacci Sequence

Sabse pehla aur sabse common pattern — har step pe pehle 2 values ka sum. Fibonacci, Climbing Stairs, House Robber — sab is pattern pe based hain:

# Fibonacci — har element = previous 2 ka sum
def fib(n):
 if n <= 1:
 return n
 dp = [0] * (n + 1)
 dp[0], dp[1] = 0, 1
 for i in range(2, n + 1):
 dp[i] = dp[i - 1] + dp[i - 2]
 return dp[n]

# Climbing Stairs — exactly same pattern!
# n stairs hain, 1 ya 2 steps le sakte ho
def climbStairs(n):
 if n <= 2:
 return n
 dp = [0] * (n + 1)
 dp[1], dp[2] = 1, 2
 for i in range(3, n + 1):
 dp[i] = dp[i - 1] + dp[i - 2]
 return dp[n]
Pattern Recognition: Agar problem mein "har step pe 1 ya 2 steps le sakte ho" ya "current = previous 2 ka function" jaisa kuch dikhe — toh ye Fibonacci pattern hai. DP relation: dp[i] = dp[i-1] + dp[i-2].

Pattern 2: House Robber

House Robber mein adjacent nahi le sakte — isliye "ya toh current lo ya previous lo" wala max lagta hai:

# House Robber — adjacent nahi le sakte
def rob(nums):
 if len(nums) == 1:
 return nums[0]
 dp = [0] * len(nums)
 dp[0] = nums[0]
 dp[1] = max(nums[0], nums[1])
 for i in range(2, len(nums)):
 dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])
 return dp[-1]

# Pattern: dp[i] = max(include current, exclude current)
# include = dp[i-2] + nums[i]
# exclude = dp[i-1]

Pattern 3: Coin Change (Unbounded Knapsack)

Coins available hain, target amount hai — kitne minimum coins chahiye? Har coin ko baar baar use kar sakte ho:

# Coin Change — minimum coins to make amount
def coinChange(coins, amount):
 dp = [float('inf')] * (amount + 1)
 dp[0] = 0 # 0 coins se 0 amount banta hai
 for i in range(1, amount + 1):
 for coin in coins:
 if coin <= i and dp[i - coin] != float('inf'):
 dp[i] = min(dp[i], dp[i - coin] + 1)
 return dp[amount] if dp[amount] != float('inf') else -1

# coins = [1, 5, 10, 25], amount = 30
# dp[30] = min coins to make 30 — answer: 2 (25+5)
Unbounded Knapsack Pattern: Jab same cheez baar baar use kar sakte ho (jaise coins unlimited hain), toh ye pattern lagta hai. Relation: dp[i] = min(dp[i], dp[i-coin] + 1) for each coin.

Pattern 4: Grid Paths

Grid mein top-left se bottom-right jaana hai — sirf right ya down ja sakte ho. Kitne unique paths hain?

# Unique Paths — m x n grid, sirf right/down
def uniquePaths(m, n):
 dp = [[1] * n for _ in range(m)]
 for i in range(1, m):
 for j in range(1, n):
 dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
 return dp[m - 1][n - 1]

# Grid Visualization:
# 1 1 1 1 1
# 1 2 3 4 5
# 1 3 6 10 15
# 1 4 10 20 35
#
# dp[i][j] = dp[i-1][j] + dp[i][j-1]
# upar se aao + baayan se aao = total paths

Pattern 5: 0/1 Knapsack

Items hain, weight limit hai — maximum value le jaao. Har item ek baar le sakte ho ya chhod sakte ho:

# 0/1 Knapsack — har item ek baar
def knapsack(W, wt, val, n):
 dp = [[0] * (W + 1) for _ in range(n + 1)]
 for i in range(1, n + 1):
 for w in range(1, W + 1):
 if wt[i - 1] <= w:
 dp[i][w] = max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w])
 else:
 dp[i][w] = dp[i - 1][w]
 return dp[n][W]

# Pattern: ya item lo (val + remaining space) ya mat lo (purana max)
# dp[i][w] = max(include, exclude)

Pattern Recognition Chart

# Pattern Recognition Quick Reference:
#
# | Problem Type | Pattern | DP Relation |
# |---------------------------|------------------|--------------------------------|
# | Fibonacci / Climbing | Linear | dp[i] = dp[i-1] + dp[i-2] |
# | House Robber | Linear Max | dp[i] = max(dp[i-1], dp[i-2]+x)|
# | Coin Change | Unbounded Knapsack| dp[i] = min(dp[i], dp[i-coin]+1)|
# | Grid Paths | 2D Grid | dp[i][j] = up + left |
# | 0/1 Knapsack | 2D Selection | dp[i][w] = max(include, exclude)|
# | Subset Sum | 0/1 Selection | dp[i][s] = dp[i-1][s] || dp[i-1][s-arr[i]] |

Try it: code khud likho

Exercise

Question: Coins = [1, 5, 10] aur amount = 12 hai. Minimum kitne coins chahiye? Sirf number daalo.

Question: Jab problem mein adjacent elements nahi le sakte (jaise House Robber), toh ye konsa DP pattern hai? Sirf pattern ka naam daalo.

Common mistakes

Lesson complete?

DP patterns samajh aa gaya? Ab 0/1 Knapsack detail mein dekhte hain — sabse important DP pattern jo interview mein baar baar aata hai.

Popular courses: Data Science Course in Lucknow · AI Course in Lucknow · Python Course in Lucknow · Power BI Course · Data Analytics Course