int rob(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
function<int(int, int)> best = [&](int i, int last) -> int {
if (i > last) return 0;
return max(nums[i] + best(i + 2, last), best(i + 1, last));
};
return max(best(0, n - 2), best(1, n - 1));
}
public int rob(int[] nums) {
int n = nums.length;
if (n == 1) return nums[0];
return Math.max(best(nums, 0, n - 2), best(nums, 1, n - 1));
}
private int best(int[] nums, int i, int last) {
if (i > last) return 0;
return Math.max(nums[i] + best(nums, i + 2, last), best(nums, i + 1, last));
}
def rob(nums):
n = len(nums)
if n == 1: return nums[0]
def best(i, last):
if i > last: return 0
return max(nums[i] + best(i + 2, last), best(i + 1, last))
return max(best(0, n - 2), best(1, n - 1))
function rob(nums: number[]): number {
const n = nums.length;
if (n === 1) return nums[0];
const best = (i: number, last: number): number => {
if (i > last) return 0;
return Math.max(nums[i] + best(i + 2, last), best(i + 1, last));
};
return Math.max(best(0, n - 2), best(1, n - 1));
}
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
auto solve = [&](int first, int last) -> int {
unordered_map<int, int> memo;
function<int(int)> best = [&](int i) -> int {
if (i > last) return 0;
auto known = memo.find(i);
if (known != memo.end()) return known->second;
int result = max(nums[i] + best(i + 2), best(i + 1));
memo[i] = result;
return result;
};
return best(first);
};
return max(solve(0, n - 2), solve(1, n - 1));
}
public int rob(int[] nums) {
int n = nums.length;
if (n == 1) return nums[0];
return Math.max(solve(nums, 0, n - 2), solve(nums, 1, n - 1));
}
private int solve(int[] nums, int first, int last) {
Map<Integer, Integer> memo = new HashMap<>();
return best(nums, memo, last, first);
}
private int best(int[] nums, Map<Integer, Integer> memo, int last, int i) {
if (i > last) return 0;
Integer known = memo.get(i);
if (known != null) return known;
int result = Math.max(nums[i] + best(nums, memo, last, i + 2), best(nums, memo, last, i + 1));
memo.put(i, result);
return result;
}
def rob(nums):
n = len(nums)
if n == 1: return nums[0]
def solve(first, last):
memo = {}
def best(i):
if i > last: return 0
known = memo.get(i)
if known is not None: return known
result = max(nums[i] + best(i + 2), best(i + 1))
memo[i] = result
return result
return best(first)
return max(solve(0, n - 2), solve(1, n - 1))
function rob(nums: number[]): number {
const n = nums.length;
if (n === 1) return nums[0];
const solve = (first: number, last: number): number => {
const memo = new Map<number, number>();
const best = (i: number): number => {
if (i > last) return 0;
const known = memo.get(i);
if (known !== undefined) return known;
const result = Math.max(nums[i] + best(i + 2), best(i + 1));
memo.set(i, result);
return result;
};
return best(first);
};
return Math.max(solve(0, n - 2), solve(1, n - 1));
}
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
auto solve = [&](int first, int last) -> int {
vector<int> dp(n + 2, 0);
for (int i = last; i >= first; i--) {
dp[i] = max(nums[i] + dp[i + 2], dp[i + 1]);
}
return dp[first];
};
return max(solve(0, n - 2), solve(1, n - 1));
}
public int rob(int[] nums) {
int n = nums.length;
if (n == 1) return nums[0];
return Math.max(solve(nums, 0, n - 2), solve(nums, 1, n - 1));
}
private int solve(int[] nums, int first, int last) {
int[] dp = new int[nums.length + 2];
for (int i = last; i >= first; i--) {
dp[i] = Math.max(nums[i] + dp[i + 2], dp[i + 1]);
}
return dp[first];
}
def rob(nums):
n = len(nums)
if n == 1: return nums[0]
def solve(first, last):
dp = [0] * (n + 2)
for i in range(last, first - 1, -1):
dp[i] = max(nums[i] + dp[i + 2], dp[i + 1])
return dp[first]
return max(solve(0, n - 2), solve(1, n - 1))
function rob(nums: number[]): number {
const n = nums.length;
if (n === 1) return nums[0];
const solve = (first: number, last: number): number => {
const dp = new Array<number>(n + 2).fill(0);
for (let i = last; i >= first; i--) {
dp[i] = Math.max(nums[i] + dp[i + 2], dp[i + 1]);
}
return dp[first];
};
return Math.max(solve(0, n - 2), solve(1, n - 1));
}
int rob(vector<int>& nums) {
int n = nums.size();
if (n == 1) return nums[0];
auto solve = [&](int first, int last) -> int {
int next1 = 0, next2 = 0;
for (int i = last; i >= first; i--) {
int cur = max(nums[i] + next2, next1);
next2 = next1;
next1 = cur;
}
return next1;
};
return max(solve(0, n - 2), solve(1, n - 1));
}
public int rob(int[] nums) {
int n = nums.length;
if (n == 1) return nums[0];
return Math.max(solve(nums, 0, n - 2), solve(nums, 1, n - 1));
}
private int solve(int[] nums, int first, int last) {
int next1 = 0, next2 = 0;
for (int i = last; i >= first; i--) {
int cur = Math.max(nums[i] + next2, next1);
next2 = next1;
next1 = cur;
}
return next1;
}
def rob(nums):
n = len(nums)
if n == 1: return nums[0]
def solve(first, last):
next1 = next2 = 0
for i in range(last, first - 1, -1):
cur = max(nums[i] + next2, next1)
next2 = next1
next1 = cur
return next1
return max(solve(0, n - 2), solve(1, n - 1))
function rob(nums: number[]): number {
const n = nums.length;
if (n === 1) return nums[0];
const solve = (first: number, last: number): number => {
let next1 = 0, next2 = 0;
for (let i = last; i >= first; i--) {
const cur = Math.max(nums[i] + next2, next1);
next2 = next1;
next1 = cur;
}
return next1;
};
return Math.max(solve(0, n - 2), solve(1, n - 1));
}