{
  "slug": "dp-fibonacci",
  "title": "DP — Fibonacci Table",
  "category": "Recursion & DP",
  "difficulty": "easy",
  "complexity": {
    "time": "O(n)",
    "space": "O(n)"
  },
  "idea": "Build the answers bottom-up in a table instead of recursing top-down. Each entry is the sum of the two before it, computed exactly once. Compare with the recursive call tree, which recomputes the same values over and over.",
  "code": [
    "dp[0] = 0; dp[1] = 1",
    "for i in 2 .. n:",
    "    dp[i] = dp[i-1] + dp[i-2]",
    "answer = dp[n]"
  ],
  "example": {
    "array": [],
    "target": 8
  },
  "invariant": "Each step is the real data structure at that step — the picture is a pure function of it.",
  "stepCount": 18,
  "steps": [
    {
      "i": 0,
      "op": "lanes",
      "caption": "Fill a table of 9 entries from the bottom up — each one computed exactly once.",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ],
          "focus": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true
          ],
          "markers": [],
          "regions": []
        }
      ]
    },
    {
      "i": 1,
      "op": "lanes",
      "caption": "dp[0] = 0 (base case).",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ],
          "focus": [
            "insert",
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            true,
            true,
            true,
            true,
            true,
            true,
            true,
            true
          ],
          "markers": [],
          "regions": []
        }
      ]
    },
    {
      "i": 2,
      "op": "lanes",
      "caption": "dp[1] = 1 (base case).",
      "note": null,
      "codeLine": 1,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ],
          "focus": [
            null,
            "insert",
            null,
            null,
            null,
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            true,
            true,
            true,
            true,
            true,
            true,
            true
          ],
          "markers": [],
          "regions": []
        }
      ]
    },
    {
      "i": 3,
      "op": "lanes",
      "caption": "dp[2] = dp[1] + dp[0] = 1 + 0.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            0,
            0,
            0,
            0,
            0,
            0,
            0
          ],
          "focus": [
            "read",
            "read",
            null,
            null,
            null,
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            true,
            true,
            true,
            true,
            true,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 2,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 4,
      "op": "lanes",
      "caption": "dp[2] = 1.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            0,
            0,
            0,
            0,
            0,
            0
          ],
          "focus": [
            null,
            null,
            "write",
            null,
            null,
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            true,
            true,
            true,
            true,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 2,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 5,
      "op": "lanes",
      "caption": "dp[3] = dp[2] + dp[1] = 1 + 1.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            0,
            0,
            0,
            0,
            0,
            0
          ],
          "focus": [
            null,
            "read",
            "read",
            null,
            null,
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            true,
            true,
            true,
            true,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 3,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 6,
      "op": "lanes",
      "caption": "dp[3] = 2.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            0,
            0,
            0,
            0,
            0
          ],
          "focus": [
            null,
            null,
            null,
            "write",
            null,
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            true,
            true,
            true,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 3,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 7,
      "op": "lanes",
      "caption": "dp[4] = dp[3] + dp[2] = 2 + 1.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            0,
            0,
            0,
            0,
            0
          ],
          "focus": [
            null,
            null,
            "read",
            "read",
            null,
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            true,
            true,
            true,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 4,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 8,
      "op": "lanes",
      "caption": "dp[4] = 3.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            0,
            0,
            0,
            0
          ],
          "focus": [
            null,
            null,
            null,
            null,
            "write",
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            false,
            true,
            true,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 4,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 9,
      "op": "lanes",
      "caption": "dp[5] = dp[4] + dp[3] = 3 + 2.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            0,
            0,
            0,
            0
          ],
          "focus": [
            null,
            null,
            null,
            "read",
            "read",
            null,
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            false,
            true,
            true,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 5,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 10,
      "op": "lanes",
      "caption": "dp[5] = 5.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            5,
            0,
            0,
            0
          ],
          "focus": [
            null,
            null,
            null,
            null,
            null,
            "write",
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 5,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 11,
      "op": "lanes",
      "caption": "dp[6] = dp[5] + dp[4] = 5 + 3.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            5,
            0,
            0,
            0
          ],
          "focus": [
            null,
            null,
            null,
            null,
            "read",
            "read",
            null,
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 6,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 12,
      "op": "lanes",
      "caption": "dp[6] = 8.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            5,
            8,
            0,
            0
          ],
          "focus": [
            null,
            null,
            null,
            null,
            null,
            null,
            "write",
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 6,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 13,
      "op": "lanes",
      "caption": "dp[7] = dp[6] + dp[5] = 8 + 5.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            5,
            8,
            0,
            0
          ],
          "focus": [
            null,
            null,
            null,
            null,
            null,
            "read",
            "read",
            null,
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 7,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 14,
      "op": "lanes",
      "caption": "dp[7] = 13.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            5,
            8,
            13,
            0
          ],
          "focus": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            "write",
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 7,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 15,
      "op": "lanes",
      "caption": "dp[8] = dp[7] + dp[6] = 13 + 8.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            5,
            8,
            13,
            0
          ],
          "focus": [
            null,
            null,
            null,
            null,
            null,
            null,
            "read",
            "read",
            null
          ],
          "placeholders": [
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            false,
            true
          ],
          "markers": [
            {
              "name": "i",
              "index": 8,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 16,
      "op": "lanes",
      "caption": "dp[8] = 21.",
      "note": null,
      "codeLine": 3,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            5,
            8,
            13,
            21
          ],
          "focus": [
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            null,
            "write"
          ],
          "markers": [
            {
              "name": "i",
              "index": 8,
              "tone": "bound"
            }
          ],
          "regions": []
        }
      ]
    },
    {
      "i": 17,
      "op": "lanes",
      "caption": "Done in 7 additions — f(8) = 21.",
      "note": null,
      "codeLine": 4,
      "stats": null,
      "lanes": [
        {
          "id": "dp",
          "label": "dp[i] = the i-th Fibonacci number",
          "array": [
            0,
            1,
            1,
            2,
            3,
            5,
            8,
            13,
            21
          ],
          "focus": [
            "settled",
            "settled",
            "settled",
            "settled",
            "settled",
            "settled",
            "settled",
            "settled",
            "settled"
          ],
          "markers": [],
          "regions": []
        }
      ]
    }
  ]
}