Lesson 6 � Advanced
Top DP Problems (LeetCode)
DP module ka last lesson hai � yahan hum top 10 problems dekhenge jo interview mein sabse zyada aati hain. Har problem ka pattern identify karo, template lagao, solve karo. In 10 problems ko acche se kar lo toh interview mein DP se darr nahi lagega. Pattern recognition hi DP ka asli skill hai!
10 Problems, 5 Patterns
# DP Problems Pattern Map:
#
# PATTERN 1: Linear DP (Fibonacci-type)
# +-- 70. Climbing Stairs
# +-- 746. Min Cost Climbing Stairs
#
# PATTERN 2: 0/1 Knapsack
# +-- 322. Coin Change
# +-- 416. Partition Equal Subset Sum
#
# PATTERN 3: Subsequence DP
# +-- 300. Longest Increasing Subsequence
# +-- 139. Word Break
#
# PATTERN 4: 2D Grid DP
# +-- 62. Unique Paths
# +-- 120. Triangle (Min Path Sum variant)
#
# PATTERN 5: Interval DP
# +-- 152. Maximum Product Subarray
# +-- 64. Decode Ways
Problem 1: Climbing Stairs (LC 70)
# 70. Climbing Stairs � Easy
# n stairs hain, 1 ya 2 steps le sakte ho
# Kitne tarike hain top pahunchne ke?
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: Fibonacci
# dp[i] = dp[i-1] + dp[i-2]
# Time: O(n), Space: O(n) � optimize to O(1)
Problem 2: Coin Change (LC 322)
# 322. Coin Change � Medium
# coins diye hain, amount diya hai
# Minimum coins se amount banao
def coinChange(coins, amount):
dp = [float('inf')] * (amount + 1)
dp[0] = 0
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
# Pattern: Unbounded Knapsack (coins unlimited)
# dp[i] = min coins to make amount i
# Time: O(amount * coins), Space: O(amount)
Problem 3: LIS (LC 300)
# 300. Longest Increasing Subsequence � Medium
# Array mein longest increasing subsequence nikalo
def lengthOfLIS(nums):
n = len(nums)
dp = [1] * n
for i in range(1, n):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
# Pattern: Linear DP with inner loop
# dp[i] = LIS ending at index i
# Time: O(n^2), Space: O(n)
Problem 4: Word Break (LC 139)
# 139. Word Break � Medium
# String ko dictionary words mein break kar sakte ho?
def wordBreak(s, wordDict):
n = len(s)
dp = [False] * (n + 1)
dp[0] = True
wordSet = set(wordDict)
for i in range(1, n + 1):
for word in wordSet:
if len(word) <= i and s[i - len(word):i] == word:
if dp[i - len(word)]:
dp[i] = True
break
return dp[n]
# Pattern: Linear DP with dictionary check
# dp[i] = True if s[0:i] can be segmented
# Time: O(n^2 * k), Space: O(n)
Problem 5: Maximum Product Subarray (LC 152)
# 152. Maximum Product Subarray � Medium
# Array mein maximum product subarray nikalo
def maxProduct(nums):
result = max(nums)
curMax, curMin = 1, 1
for num in nums:
vals = (num, num * curMax, num * curMin)
curMax, curMin = max(vals), min(vals)
result = max(result, curMax)
return result
# Pattern: Track max AND min (negative � negative = positive)
# curMax = max(num, num*curMax, num*curMin)
# curMin = min(num, num*curMax, num*curMin)
# Time: O(n), Space: O(1)
Problem 6: Decode Ways (LC 91)
# 91. Decode Ways � Medium
# "12" ? "AB" (1,2) ya "L" (12)
# Kitne tarike se decode kar sakte ho?
def numDecodings(s):
if s[0] == '0':
return 0
n = len(s)
dp = [0] * (n + 1)
dp[0], dp[1] = 1, 1
for i in range(2, n + 1):
if s[i-1] != '0':
dp[i] += dp[i-1]
if 10 <= int(s[i-2:i]) <= 26:
dp[i] += dp[i-2]
return dp[n]
# Pattern: Fibonacci-type with conditions
# Single digit (1-9) ya double digit (10-26) decode ho sakta hai
# Time: O(n), Space: O(n)
Problem 7: Unique Paths (LC 62)
# 62. Unique Paths � Medium
# m x n grid mein kitne unique paths hain?
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]
# Pattern: 2D Grid DP
# dp[i][j] = paths to reach cell (i,j)
# dp[i][j] = dp[i-1][j] + dp[i][j-1]
# Time: O(m*n), Space: O(m*n) � optimize to O(n)
Problem 8: Min Cost Climbing Stairs (LC 746)
# 746. Min Cost Climbing Stairs � Easy
# Har step pe cost hai, 1 ya 2 steps le sakte ho
# Minimum cost se top pahuncho
def minCostClimbingStairs(cost):
n = len(cost)
dp = [0] * (n + 1)
for i in range(2, n + 1):
dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
return dp[n]
# Pattern: Linear DP with cost
# dp[i] = minimum cost to reach step i
# Ya toh i-1 se aao (cost[i-1] lagao)
# Ya toh i-2 se aao (cost[i-2] lagao)
# Time: O(n), Space: O(n)
Problem 9: Partition Equal Subset Sum (LC 416)
# 416. Partition Equal Subset Sum � Medium
# Array ko 2 equal sum subsets mein divide kar sakte ho?
def canPartition(nums):
total = sum(nums)
if total % 2 != 0:
return False
target = total // 2
dp = [False] * (target + 1)
dp[0] = True
for num in nums:
for j in range(target, num - 1, -1):
dp[j] = dp[j] or dp[j - num]
return dp[target]
# Pattern: 0/1 Knapsack (subset sum variant)
# Total sum even hai toh half sum pe subset sum check karo
# Time: O(n * target), Space: O(target)
Problem 10: Triangle (LC 120)
# 120. Triangle � Medium
# Triangle mein top se bottom jaao
# Minimum path sum nikalo
def minimumTotal(triangle):
n = len(triangle)
dp = triangle[-1][:] # Last row se shuru
for i in range(n - 2, -1, -1):
for j in range(i + 1):
dp[j] = triangle[i][j] + min(dp[j], dp[j + 1])
return dp[0]
# Pattern: 2D Grid DP (bottom-up)
# Har node ke liye: neeche left ya neeche right
# Bottom-up se shuru karo � space O(n)
# Time: O(n^2), Space: O(n)
Try it: code khud likho
Exercise
Question: String = "catsandog", wordDict = ["cats", "dog", "sand", "and", "cat"]. Kya word break possible hai? "True" ya "False" daalo.
Question: Coin Change problem kis DP pattern pe based hai? "0/1 knapsack" ya "unbounded knapsack" ya "linear" � ek choose karo.
Common mistakes
- Pattern pehchaan na hona: Har problem unique lagti hai but 5-6 patterns repeat hote hain. Pehle pattern identify karo, phir template lagao. Climbing Stairs = Fibonacci, Coin Change = Unbounded Knapsack, Partition = 0/1 Knapsack.
- Base case miss karna: Har problem ka apna base case hota hai. Climbing Stairs = dp[1]=1, dp[2]=2. Coin Change = dp[0]=0. Word Break = dp[0]=True. Base case galat hoga toh saari table galat fill hogi.
- DP relation galat hona: Coin Change mein min lagta hai (minimum coins). Climbing Stairs mein + lagta hai (count). Maximum Product mein max AND min dono track karo (negative � negative = positive).
- Space optimization skip karna: Linear DP mein O(1) space possible hai (sirf 2 variables). Grid DP mein O(n) space possible hai (sirf 2 rows). Interview mein space optimization zaroor batao.
- Brute force se shuru na karna: Pehle brute force recursion likho, phir memoization lagao, phir tabulation convert karo, phir space optimize karo. Ye 4-step process follow karo � har DP problem solve ho jaayegi.
Congratulations! Dynamic Programming ka poora module complete ho gaya. Ab practice karo � LeetCode pe ye 10 problems solve karo aur patterns pe focus karo. DP se darr nahi lagega ab!