class Solution {
public int rob(int[] nums) {
int n = nums.length - 1;
int cache[] = new int[n + 1];
Arrays.fill(cache, -1);
return tabOpt(n, cache, nums);
}
private int recur(int n, int[] cache, int[] nums) {
if (n == 0)
return cache[n] = nums[0];
if (n < 0)
return 0;
if (cache[n] != -1)
return cache[n];
int take = nums[n] + recur(n - 2, cache, nums);
int ntake = recur(n - 1, cache, nums);
cache[n] = Math.max(take, ntake);
return cache[n];
}
private int tab(int n, int[] cache, int[] nums) {
cache[0] = nums[0];
for (int i = 1; i <= n; i++) {
int take = nums[i] + ((i - 2 >= 0) ? cache[i - 2] : 0);
int ntake = cache[i - 1];
cache[i] = Math.max(take, ntake);
}
return cache[n];
}
private int tabOpt(int n, int[] cache, int[] nums) {
int prev = nums[0], prev2 = 0;
for (int i = 1; i <= n; i++) {
int take = nums[i] + prev2;
int ntake = prev;
prev2 = prev;
prev = Math.max(take, ntake);
}
return prev;
}
}