198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
解: 递归的从左往右尝试模型。从第0个元素开始递归,来到第i个元素的时候有两种选择,一个是偷这家,一个是不偷。选择偷的话,就带着偷到的钱跳到i + 2继续选择。选择不偷的话就跳到i + 1继续选择。两种抉择选更大的结果。当i超过数组长度时,就意味着再也偷不到了,返回0。
// 暴力递归
const rob = function(nums) {
const getRes = (i) => {
if (i >= nums.length) return 0
const p1 = getRes(i + 2) + nums[i]
const p2 = getRes(i + 1)
return Math.max(p1, p2)
}
return getRes(0)
};
// dp
const rob = function(nums) {
const dp = []
dp[nums.length] = 0
for (let i = nums.length - 1; i >= 0; i--) {
dp[i] = Math.max((dp[i + 2] ?? 0) + nums[i], dp[i + 1])
}
return dp[0]
};