1. Recursive Decision Tree
Intuition
For each house, branch into either robbing it and advancing by 2, or skipping it and advancing by 1.
Algorithm
- Define
dfs(i). - If
i >= nums.length, return 0. - Option 1: rob house i ->
nums[i] + dfs(i + 2). - Option 2: skip house i ->
dfs(i + 1). - Return max(Option 1, Option 2).
#include <iostream>#include <vector>#include <algorithm> using namespace std; int dfs(int i, const vector<int>& nums) { if (i >= (int)nums.size()) return 0; int rob = nums[i] + dfs(i + 2, nums); int skip = dfs(i + 1, nums); return max(rob, skip);} int robRec(vector<int>& nums) { return dfs(0, nums);} int main() { vector<int> nums = {2, 7, 9, 3, 1}; cout << "Max Robbed (Recursive): " << robRec(nums) << endl; return 0;}Time & Space Complexity
- Time complexity:
O(2^n) - Space complexity:
O(n) call stack