DIGITAL GURU
Java DSA Portfolio

1D DP (Fibonacci, Climbing Stairs, House Robber, Decode Ways)

Master Overlapping Subproblems, Top-Down Memoization, Bottom-Up Tabulation, and 1D DP State Transitions.

Anuj Kumar Singh Written by Anuj Kumar Singh (Lead Engineer, 13+ yrs exp) 5 min read Verified Spring Boot 3+ Guide

Formal Definition & Classification Types

Definition: Dynamic Programming (DP) is an algorithmic optimization technique that solves complex problems by breaking them down into simpler, overlapping subproblems, storing subproblem results (in a table/cache) to prevent redundant recalculations.

Core Approaches to DP:

  • Top-Down (Memoization): Recursive approach that caches return values in a hash table or array.
  • Bottom-Up (Tabulation): Iterative table-filling approach starting from base cases up to target result.

Real-World Analogy

Dynamic Programming is writing down the answer to $1+1+1+1+1 = 5$ on paper. If someone adds another $+1$, you don't recalculate everything from scratch—you read your saved answer $5$ and add $1$ to get $6$!

Dynamic Programming Fundamentals

Applies when a problem exhibits **Overlapping Subproblems** and **Optimal Substructure**.

Production Code Example:

HouseRobber.java
public class HouseRobber {
    public int rob(int[] nums) {
        int prev2 = 0, prev1 = 0;
        for (int x : nums) {
            int cur = Math.max(prev1, prev2 + x);
            prev2 = prev1;
            prev1 = cur;
        }
        return prev1;
    }
}

Key Complexity & Algorithmic Takeaways:

When implementing 1D DP (Fibonacci, Climbing Stairs, House Robber, Decode Ways) in coding interviews and production applications, keep these core guidelines in mind:

  • Time Complexity Analysis: Always evaluate best-case, average-case, and worst-case time complexities ($O(1)$, $O(\log n)$, $O(n)$, $O(n \log n)$, $O(n^2)$).
  • Space Complexity & Memory Bounds: Account for auxiliary memory usage, call stack frame recursion overhead, and heap allocations.
  • Edge Cases & Validation: Test empty inputs, null pointers, single-element collections, duplicate values, and integer overflow bounds.
  • Optimal vs Naive Solutions: Start with a clear brute-force solution, then optimize using techniques like Hashing, Two Pointers, Windowing, or Dynamic Programming.

Summary Takeaway:

Mastering 1D DP (Fibonacci, Climbing Stairs, House Robber, Decode Ways) provides the foundational problem-solving skills needed to pass technical coding interviews at top tech companies and write ultra-performant software systems.

1D Pattern

State recurrence: $dp[i] = \max(dp[i-1], dp[i-2] + nums[i])$.