Problem of the day
A thief wants to loot houses. He knows the amount of money in each house. He cannot loot two consecutive houses. Find the maximum amount of money he can loot.
The first line of input contains a single integer 'N' denoting the total number of houses.
The second line of input contains 'N' single space-separated integers, denoting the amount of money in every 'i-th' house.
Output Format :
The only line of output will print the maximum amount of loot that is possible.
Note :
You don’t need to print anything, it has already been taken care of. Just implement the given function.
0 <= 'N' <= 10^5
0 <= 'A[i]' <= 10^4
Where 'A[i]' represents the money present in the 'i-th' house.
Time limit: 1 sec
4
10 2 3 11
21
Since the thief cant loot two consecutive houses, the ways in which he may loot are:
1. [10, 3]: a total loot of 13
2. [10, 11]: a total loot of 21
3. [2, 11]: a total loot of 13
4. [10]: a total loot of 10
5. [2]: a total loot of 2
6. [3]: a total loot of 3
7. [11]: a total loot of 11
We can't neglect the option to loot just either of the houses if it yields the maximum loot.
From all the possible seven ways, the second option yields the maximum loot amount and hence the answer.
6
5 5 10 100 10 5
110
Can you think of a brute force approach?
Suppose that the robber is at the ith house. The robber has two options:
You will follow the same for the rest of the houses. Thus, if maxLoot(i) is the maximum loot possible when we’re at the ith house, then the recursive definition follows:
maxLoot(i) = maximum( loot[i] + maxLoot(i+2), maxLoot(i+1))
Note: This approach has an exponential time complexity because this problem has overlapping subproblems for which we recompute the answer over and over again. To avoid that recomputation, we can store the answer of each recursive call (subproblem) in an array or hashmap so that the next time we need the answer to that subproblem, we can directly fetch it from there instead of calculating it again.
O(2^N), where N is the number of houses.
At each of the N houses, we have two options, hence for each recursive call there will be two further calls.
O(N), where N is the number of houses.
A recursion stack is required to keep track of all recursive calls which takes O(N) memory in the system stack.