1D Dynamic Programming — Complete Guide
Advertisement
What is 1D DP?
Dynamic programming solves problems by breaking them into overlapping subproblems and storing results. In 1D DP, the state space is a single array — dp[i] represents some optimal answer considering the first i items or ending at position i.
The 8 Core 1D DP Patterns
Pattern 1 — Fibonacci / Staircase
Current state depends on the previous 1 or 2 states.
dp[i] = dp[i-1] + dp[i-2]
Problems: Climbing Stairs, Fibonacci Number, Min Cost Climbing Stairs
Pattern 2 — House Robber (Skip 1)
Can't pick adjacent elements. Take vs skip.
dp[i] = max(dp[i-1], dp[i-2] + nums[i])
Problems: House Robber, House Robber II, Delete & Earn
Pattern 3 — Kadane (Max Subarray)
Max subarray ending at index i: extend or restart.
dp[i] = max(nums[i], dp[i-1] + nums[i])
Problems: Max Subarray, Max Product Subarray
Pattern 4 — Coin Change (Unbounded Knapsack)
Minimum coins: try all denominations.
dp[amount] = min(dp[amount-coin]+1) for each coin
Problems: Coin Change, Coin Change II, Perfect Squares
Pattern 5 — LIS (Longest Increasing Subsequence)
O(n²) DP or O(n log n) patience sorting.
dp[i] = max(dp[j]+1) for j < i where nums[j] < nums[i]
Problems: LIS, Russian Dolls, Longest Bitonic Subseq
Pattern 6 — Jump Game
Can you reach / min jumps to reach end.
reach = max(reach, i + nums[i])
Problems: Jump Game, Jump Game II, Jump Game III
Pattern 7 — Decode Ways / Counting
Count ways to decode/partition with valid sub-choices.
dp[i] = dp[i-1] (single digit) + dp[i-2] (two digits if valid)
Problems: Decode Ways, Climbing Stairs with Constraints
Pattern 8 — Palindromic Subsequences
Count/find longest palindromic subsequence in 1D or 2D.
# For palindrome substrings, expand around center
# For palindromic subsequence, use 2D DP
Complexity Reference
| Pattern | Time | Space |
|---|---|---|
| Fibonacci | O(n) | O(1) |
| House Robber | O(n) | O(1) |
| Kadane | O(n) | O(1) |
| Coin Change | O(n*m) | O(n) |
| LIS O(n²) | O(n²) | O(n) |
| LIS O(n log n) | O(n log n) | O(n) |
| Jump Game | O(n) | O(1) |
| Decode Ways | O(n) | O(1) |
5-Language Templates
Fibonacci (Space Optimized)
# Python
a, b = 0, 1
for _ in range(n): a, b = b, a+b
return a
// C++
int a=0, b=1;
for(int i=0;i<n;i++){int c=a+b;a=b;b=c;}
return a;
// Java
int a=0,b=1;
for(int i=0;i<n;i++){int c=a+b;a=b;b=c;}
return a;
// JavaScript
let [a,b]=[0,1];
for(let i=0;i<n;i++){[a,b]=[b,a+b];}
return a;
// C
int a=0,b=1,c;
for(int i=0;i<n;i++){c=a+b;a=b;b=c;}
return a;
Problem Index
| # | Problem | Pattern | Difficulty |
|---|---|---|---|
| 01 | Climbing Stairs | Fibonacci | Easy |
| 02 | Min Cost Climbing Stairs | Fibonacci | Easy |
| 03 | Fibonacci Number | Fibonacci | Easy |
| 04 | Tribonacci Number | Fibonacci | Easy |
| 05 | House Robber | Skip Adjacent | Medium |
| 06 | House Robber II (circular) | Skip Adjacent x2 | Medium |
| 07 | Delete and Earn | House Robber on freq | Medium |
| 08 | Maximum Subarray | Kadane | Easy |
| 09 | Maximum Product Subarray | Kadane variant | Medium |
| 10 | Coin Change (min coins) | Unbounded Knapsack | Medium |
| 11 | Coin Change II (count ways) | Unbounded Knapsack | Medium |
| 12 | Perfect Squares | BFS / Unbounded KS | Medium |
| 13 | Jump Game | Greedy reach | Medium |
| 14 | Jump Game II | Greedy min jumps | Medium |
| 15 | Decode Ways | Counting DP | Medium |
| 16 | Word Break | Reachability DP | Medium |
| 17 | LIS (Longest Increasing Subsequence) | LIS | Medium |
| 18 | Longest Bitonic Subsequence | LIS variant | Medium |
| 19 | Russian Doll Envelopes | 2D LIS | Hard |
| 20 | Max Sum Increasing Subsequence | LIS + sum | Medium |
| 21 | Palindromic Substrings | Expand around center | Medium |
| 22 | Longest Palindromic Subsequence | 2D DP | Medium |
Advertisement