打家劫舍 II
该题在打家劫舍的基础上增加了限制条件,首尾二选一。
动态规划
function rob(nums: number[]): number {
if (nums.length <= 2) return Math.max(...nums)
const robRange = (nums: number[], start: number, end: number): number => {
// 初始化状态
let p = nums[start], q = Math.max(nums[start], nums[start + 1])
for (let i = start + 2; i <= end; i++) {
// 状态转移
const max = Math.max(q, p + nums[i])
p = q
q = max
}
return q
}
return Math.max(
robRange(nums, 0, nums.length - 2), // 首
robRange(nums, 1, nums.length - 1) // 尾
)
}