Dynamic programming (DP) is a method for solving complex problems by breaking them into simpler subproblems, solving each subproblem once, and storing their solutions for reuse. This roadmap provides a structured path to master DP, covering 20 key patterns with over 500 problems sourced from platforms like LeetCode, Codeforces, AtCoder, and GeeksforGeeks. Problems are organized by difficulty (easy, medium, hard) to ensure progressive learning, incorporating advice from top coders to focus on pattern recognition and state optimization.
The following 20 patterns cover the spectrum of DP problems, from foundational to advanced, based on common problem types identified in resources like AlgoMaster’s “20 Patterns to Master Dynamic Programming” and GitHub repositories.
- Fibonacci Sequence: Problems where the solution depends on smaller instances, often with a recursive relation like F(n) = F(n-1) + F(n-2).
- Kadane’s Algorithm: Optimizes contiguous subarray problems, such as finding the maximum subarray sum.
- 0/1 Knapsack: Select a subset of items with weight and value constraints, choosing each item at most once.
- Unbounded Knapsack: Similar to 0/1 Knapsack but allows multiple selections of items.
- Longest Common Subsequence (LCS): Find the longest subsequence present in two sequences in the same order.
- Longest Increasing Subsequence (LIS): Identify the longest subsequence with increasing values.
- Palindromic Subsequence: Find subsequences that read the same forwards and backwards.
- Edit Distance: Transform one sequence into another with minimum operations (insert, delete, substitute).
- Subset Sum: Determine if a subset of numbers sums to a target value.
- String Partition: Partition a string into substrings satisfying specific conditions.
- Catalan Numbers: Solve combinatorial problems like valid parentheses or binary search tree counts.
- Matrix Chain Multiplication: Optimize the order of matrix multiplications to minimize cost.
- Count Distinct Ways: Count the number of ways to achieve a goal, often combinatorial.
- DP on Grids: Navigate or optimize paths in a grid, considering multiple directions.
- DP on Trees: Solve problems on tree structures, computing values based on children or ancestors.
- DP on Graphs: Optimize paths or cycles in graphs, considering neighbor dependencies.
- Digit DP: Count or sum over a range of numbers, processing digits individually.
- Bitmasking DP: Use bitmasks to represent subsets or combinations for small sets.
- Probability DP: Calculate probabilities or expected values in random processes.
- State Machine DP: Model problems as state transitions to optimize sequences.
Below is the roadmap with problems for each pattern, organized by difficulty. Each pattern includes at least 25 problems, sourced from LeetCode, Codeforces, AtCoder, GeeksforGeeks, and GitHub repositories like rabiulcste/dynamic-programming. Problems are selected to cover variations and ensure a mix of classic and modern challenges.
Description: Solve problems where the solution builds on smaller subproblems with a recursive relationship.
- Easy (10 problems):
- LeetCode: Climbing Stairs (1 or 2 steps) ✅
- LeetCode: Min Cost Climbing Stairs ✅
- GeeksforGeeks: Fibonacci Numbers ✅
- Codeforces: Fibonacci
- AtCoder: Frog 1
- LeetCode: House Robber
- GeeksforGeeks: Nth Tribonacci Number
- Codeforces: Simple Fibonacci
- AtCoder: Frog 2
- LeetCode: Decode Ways
- Medium (10 problems):
- LeetCode: House Robber II
- LeetCode: Fibonacci Number
- Codeforces: Fibonacci Sum
- GeeksforGeeks: Lucas Number
- AtCoder: Frog 3
- LeetCode: Unique Paths
- Codeforces: Fibonacci Divisibility
- GeeksforGeeks: Nth Catalan Number
- LeetCode: Domino and Tromino Tiling
- Codeforces: Fibonacci Extensions
- Hard (5 problems):
- LeetCode: Longest Valid Parentheses
- Codeforces: Fibonacci and GCD
- GeeksforGeeks: Count of AP Subsequences
- LeetCode: Arithmetic Slices II
- AtCoder: Vacation
Description: Optimize problems involving contiguous subarrays, like maximum subarray sum.
- Easy (10 problems):
- LeetCode: Maximum Subarray
- GeeksforGeeks: Max 1D Range Sum
- Codeforces: Maximum Subarray Sum
- LeetCode: Best Time to Buy and Sell Stock
- GeeksforGeeks: Max Sum of Non-Adjacent Elements
- Codeforces: Simple Kadane
- LeetCode: Degree of an Array
- GeeksforGeeks: Kadane’s Algorithm Variations
- Codeforces: Subarray Sum
- LeetCode: Shortest Unsorted Continuous Subarray
- Medium (10 problems):
- LeetCode: Maximum Product Subarray
- Codeforces: Maximum Subarray Product
- GeeksforGeeks: Max Circular Subarray Sum
- LeetCode: Maximum Sum Circular Subarray
- Codeforces: Kadane with Constraints
- LeetCode: Best Time to Buy and Sell Stock II
- GeeksforGeeks: Sum of Subset (2D)
- Codeforces: Subarray with K Sum
- LeetCode: House Robber III
- GeeksforGeeks: Max Sum with No Consecutive Elements
- Hard (5 problems):
- LeetCode: Maximum Subarray Sum with One Deletion
- Codeforces: Complex Kadane
- LeetCode: K-Concatenation Maximum Sum
- GeeksforGeeks: Max Sum with K Elements
- Codeforces: Kadane with Modifications
Description: Select items with weight and value constraints, each item used at most once.
- Easy (10 problems):
- GeeksforGeeks: 0-1 Knapsack Problem
- LeetCode: Partition Equal Subset Sum
- Codeforces: Knapsack Basic
- AtCoder: Knapsack 1
- GeeksforGeeks: Subset Sum
- LeetCode: Target Sum
- Codeforces: Simple Knapsack
- GeeksforGeeks: Knapsack with Large Weights
- AtCoder: Knapsack 2
- LeetCode: Last Stone Weight II
- Medium (10 problems):
- LeetCode: Ones and Zeroes
- Codeforces: Knapsack with Constraints
- GeeksforGeeks: Fractional Knapsack
- LeetCode: Partition Array Into Two Arrays to Minimize Sum Difference
- Codeforces: Knapsack Variations
- GeeksforGeeks: Knapsack with Duplicate Items
- LeetCode: Form Array by Concatenating Subarrays
- Codeforces: Knapsack with Multiple Constraints
- GeeksforGeeks: 0-1 Knapsack Bottom Up
- LeetCode: Find Two Non-overlapping Sub-arrays Each With Target Sum
- Hard (5 problems):
- LeetCode: Tallest Billboard
- Codeforces: Advanced Knapsack
- GeeksforGeeks: Knapsack with Multiple Bags
- LeetCode: Profitable Schemes
- Codeforces: Knapsack with Complex Constraints
Description: Similar to 0/1 Knapsack but items can be selected multiple times.
- Easy (10 problems):
- GeeksforGeeks: Unbounded Knapsack
- LeetCode: Coin Change
- AtCoder: Coins
- Codeforces: Unbounded Knapsack Basic
- GeeksforGeeks: Minimum Number of Coins
- LeetCode: Coin Change II
- Codeforces: Simple Coin Change
- GeeksforGeeks: Coin Change Optimized
- AtCoder: Knapsack 2
- LeetCode: Combination Sum IV
- Medium (10 problems):
- LeetCode: Perfect Squares
- Codeforces: Coin Change Variations
- GeeksforGeeks: Minimum Coins for Change
- LeetCode: Number of Ways to Form a Target String
- Codeforces: Unbounded Knapsack with Constraints
- GeeksforGeeks: Coin Change Bottom Up
- LeetCode: Minimum Cost For Tickets
- Codeforces: Coin Combinations
- GeeksforGeeks: Unbounded Knapsack Variations
- LeetCode: Number of Dice Rolls With Target Sum
- Hard (5 problems):
- LeetCode: Number of Ways to Stay in the Same Place After Some Steps
- Codeforces: Complex Coin Change
- GeeksforGeeks: Coin Change with Constraints
- LeetCode: Number of Ways to Paint N × 3 Grid
- Codeforces: Advanced Unbounded Knapsack
Description: Find the longest subsequence present in two sequences.
- Easy (10 problems):
- LeetCode: Longest Common Subsequence
- GeeksforGeeks: LCS Length
- AtCoder: LCS
- Codeforces: Simple LCS
- GeeksforGeeks: LCS Print
- LeetCode: Is Subsequence
- Codeforces: LCS Basic
- GeeksforGeeks: Shortest Common Supersequence
- LeetCode: Shortest Common Supersequence
- AtCoder: Grid 1
- Medium (10 problems):
- LeetCode: Longest Common Substring
- Codeforces: LCS with Constraints
- GeeksforGeeks: LCS of Three Strings
- LeetCode: Delete Operation for Two Strings
- Codeforces: LCS Variations
- GeeksforGeeks: LCS Print Backtrack
- LeetCode: Minimum ASCII Delete Sum for Two Strings
- Codeforces: LCS with Modifications
- GeeksforGeeks: Longest Repeating Subsequence
- LeetCode: Uncrossed Lines
- Hard (5 problems):
- LeetCode: Distinct Subsequences
- Codeforces: Advanced LCS
- GeeksforGeeks: LCS with Constraints
- LeetCode: Edit Distance
- Codeforces: Complex LCS
Description: Find the longest subsequence with increasing values.
- Easy (10 problems):
- LeetCode: Longest Increasing Subsequence
- GeeksforGeeks: Longest Increasing Subsequence
- Codeforces: Simple LIS
- LeetCode: Increasing Triplet Subsequence
- GeeksforGeeks: LIS O(nlogn)
- Codeforces: LIS Basic
- LeetCode: Find the Longest Valid Obstacle Course at Each Position
- GeeksforGeeks: Building Bridges
- Codeforces: LIS Variations
- LeetCode: Number of Longest Increasing Subsequence
- Medium (10 problems):
- LeetCode: Russian Doll Envelopes
- Codeforces: LIS with Constraints
- GeeksforGeeks: Longest Bitonic Subsequence
- LeetCode: Longest String Chain
- Codeforces: LIS Modifications
- GeeksforGeeks: Length of LIS
- LeetCode: Maximum Length of Pair Chain
- Codeforces: LIS with Weights
- GeeksforGeeks: LIS with Constraints
- LeetCode: Largest Divisible Subset
- Hard (5 problems):
- LeetCode: Longest Increasing Path in a Matrix
- Codeforces: Complex LIS
- GeeksforGeeks: LIS with Multiple Constraints
- LeetCode: Number of Ways to Reconstruct a Tree
- Codeforces: Advanced LIS
Description: Find subsequences that are palindromes.
- Easy (10 problems):
- LeetCode: Longest Palindromic Substring
- GeeksforGeeks: Longest Palindromic Subsequence
- Codeforces: Simple Palindrome
- LeetCode: Palindromic Substrings
- GeeksforGeeks: Count Palindrome Substrings
- Codeforces: Palindrome Basic
- LeetCode: Valid Palindrome
- GeeksforGeeks: Minimum Cuts for Palindrome
- Codeforces: Palindrome Variations
- LeetCode: Valid Palindrome II
- Medium (10 problems):
- LeetCode: Longest Palindromic Subsequence
- Codeforces: Palindrome with Constraints
- GeeksforGeeks: Palindrome Partitioning
- LeetCode: Palindrome Partitioning
- Codeforces: Palindrome Modifications
- GeeksforGeeks: Longest Repeating and Non-overlapping Substring
- LeetCode: Palindrome Partitioning II
- Codeforces: Palindrome with Gaps
- GeeksforGeeks: Count Palindromic Subsequences
- LeetCode: [Remove Palindromic Subsequences](https://leetcode.com/problems/remove-palindromic