LC 0198 [E] House Robber - ALawliet/algorithms GitHub Wiki

https://leetcode.com/problems/house-robber/discuss/156523/From-good-to-great.-How-to-approach-most-of-DP-problems

f(0) = nums[0]
f(1) = max(num[0], num[1])
f(i) = max(f(i-2) + nums[i], f(i-1))
class Solution:
    def rob(self, nums: List[int]) -> int:
        @cache
        def dp(i):
            if i < 0: return 0
            return max(dp(i-2) + nums[i], dp(i-1))

        return dp(len(nums)-1)
class Solution:
    def rob(self, nums: List[int]) -> int:
        memo = {}

        def dp(i):
            if i in memo:
                return memo[i]
            
            if i < 0:
                return 0
            
            choice = max(dp(i-2) + nums[i], dp(i-1))
            memo[i] = choice
            return choice
            
        return dp(len(nums)-1)
class Solution:
    def rob(self, nums: List[int]) -> int:
        if not nums: return 0
        if len(nums) == 1: return nums[0]
        
        T = [0] * len(nums)
        
        T[0] = nums[0]
        T[1] = max(nums[0], nums[1])
        
        for i in range(2, len(nums)):
            T[i] = max(T[i-2] + nums[i], T[i-1])
            
        return T[-1]
class Solution:
    def rob(self, nums):
        i1, i2 = 0, 0 # [i-1], [i-2]
        for num in nums:
            i1, i2 = i2, max(i1 + num, i2)
        return i2
/* the order is: prev2, prev1, num  */
public int rob(int[] nums) {
    if (nums.length == 0) return 0;
    int prev1 = 0;
    int prev2 = 0;
    for (int num : nums) {
        int tmp = prev1;
        prev1 = Math.max(prev2 + num, prev1);
        prev2 = tmp;
    }
    return prev1;
}