https://leetcode-cn.com/problems/house-robber/
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
思路:
在偷最后一家的时候,可能是偷了最后一家的金额+倒数第三家以前的总额,或者偷倒数第二家以前的总额,取二者的最大值。
所以方程可以理解为:
dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
var rob = function(nums) {
let dp = []
dp[0] = nums[0]
if(nums.length > 1) {
dp[1] = Math.max(nums[1], nums[0])
}
for(let i = 2; i < nums.length; i++) {
dp[i] = Math.max(nums[i] + dp[i - 2], dp[i - 1])
}
return dp[dp.length - 1]
};
把nums的数组看做从0开始,也可以写作
var rob = function(nums) {
let dp = []
dp[0] = 0
dp[1] = nums[0]
for(let i = 2; i <= nums.length; i++) {
dp[i] = Math.max(nums[i - 1] + dp[i - 2], dp[i - 1])
}
return dp[nums.length]
};
优化:
var rob = function(nums) {
let pre1 = 0
let pre2 = nums[0]
let result = pre2
for(let i = 2; i <= nums.length; i++) {
result = Math.max(nums[i - 1] + pre1, pre2)
pre1 = pre2
pre2 = result
}
return result
};