【动态规划】打家劫舍

48 阅读2分钟

题目

  • 198. 打家劫舍

  • 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

思路

  • 动态规划dp(Dynamic Programming)
  • 对于偷到i家的时候,有两种情况:1.偷;2.不偷
  • 如果偷,那么前一家就不能偷。如果不偷,那么前一家就一定偷(为了金额最大化)
  • 通过以上分析,就可以对这两种条件进行判断,取两种情况下的最大化收益

题解

var rob = function(nums) {
    if (nums.length === 0) return 0;
    if(nums.length === 1) return nums[0]
    const dp = [nums[0], Math.max(nums[0], nums[1])]; // dp数组用来保存当前情况下,能偷到的最大金额。比如 i=0时,肯定是偷最高;i=1时,就看偷0或1哪个更高
    for(var i = 2; i < nums.length;i++) {
        const steal = dp[i - 2] + nums[i]; // 偷的情况,是前前家偷,然后偷i这家
        const notSteal = dp[i - 1]; // 不偷的情况,最大金额就是上一家偷到的金额
        dp.push(Math.max(steal, notSteal)); // 取上面两种情况的最大金额
    }
    return Math.max(...dp)
};

扩展