1. 题目

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。

示例 1:
输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。示例 2:
输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/house-robber
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 动态规划解题

相关题目:
LeetCode 213. 打家劫舍 II(DP)
LeetCode 337. 打家劫舍 III(记忆化+递归)

  • dp[i]dp[i]dp[i]表示经过i房间时,可以获得的最大金额
  • 显然有 dp[0]=nums[0];dp[1]=max(nums[0],nums[1])dp[0] = nums[0]; \quad dp[1] = max(nums[0],nums[1])dp[0]=nums[0];dp[1]=max(nums[0],nums[1])
  • 对第 iii 个房间有两种选择:
  1. 偷,dp[i]=dp[i−2]+nums[i]dp[i] = dp[i-2]+nums[i]dp[i]=dp[i−2]+nums[i]
  2. 不偷,dp[i]=dp[i−1]dp[i] = dp[i-1]dp[i]=dp[i−1]

取2种情况的大者作为:经过i房间获得的最大金额
状态转移公式:dp[i]=max(dp[i−2]+nums[i],dp[i−1])dp[i] = max(dp[i-2]+nums[i], \quad dp[i-1])dp[i]=max(dp[i−2]+nums[i],dp[i−1])

class Solution {public:int rob(vector<int>& nums) {int n = nums.size(), i;if(n == 0)return 0;else if(n == 1)return nums[0];else if(n == 2)return max(nums[0],nums[1]);int dp[n] = {0};dp[0] = nums[0];dp[1] = max(nums[0],nums[1]);for(i = 2; i < n; ++i){dp[i] = max(dp[i-2]+nums[i], dp[i-1]);}return dp[n-1];}
};
  • 观察到上面转态转移公式只跟前两个转态有关,可以进行压缩,节省空间
class Solution {public:int rob(vector<int>& nums) {int n = nums.size(), i;if(n == 0)return 0;else if(n == 1)return nums[0];else if(n == 2)return max(nums[0],nums[1]);int dp_i, dp_i_2 = nums[0], dp_i_1 = max(nums[0],nums[1]);for(i = 2; i < n; ++i){dp_i = max(dp_i_2+nums[i], dp_i_1);dp_i_2 = dp_i_1;dp_i_1 = dp_i;}return dp_i;}
};

LeetCode 198. 打家劫舍(DP)相关推荐

  1. leetcode 198打家劫舍

    leetcode 198打家劫舍 题目链接:打家劫舍 题目描述:你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间 ...

  2. leetcode - 198. 打家劫舍

    198. 打家劫舍 -------------------------------------- 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房 ...

  3. 102. Leetcode 198. 打家劫舍 (动态规划-打家劫舍)

    步骤一.确定状态: 1.确定原问题中变化的变量个数 2.考虑最后一步: 对于第N间房屋,有两个选项: 偷窃第N间房屋,那么就不能偷窃第N−1间房屋,偷窃总金额为前N-2间房屋的最高总金额与第N间房屋的 ...

  4. Leetcode 198.打家劫舍 (每日一题 20210622)

    你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警.给定一个代表每个 ...

  5. leetcode 198. 打家劫舍(最简单的动态规划问题)

    题目 思路 经典的动态规划问题 第 i 家:偷,或者不偷 -- 从这两种选择中,选择最大值. 1.如果 不偷,则等于 前 i-1 家最大 2.如果 偷,则等于 前 i-2 家最大 + 第 i 家 题解 ...

  6. [leetcode] 198.打家劫舍

    你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个代表每 ...

  7. leetcode 198. 打家劫舍 思考分析

    目录 1.题目 2.求解思路 3.代码 1.题目 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同 ...

  8. LeetCode 198. 打家劫舍(动态规划)

    题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定 ...

  9. LeetCode 198 打家劫舍

    题目描述 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻 的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警.给定 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记9 直方图与匹配(四)反向投影(back projection)
  2. scala学习手记25 - Curry化
  3. TabHost 和 FragmentTabHost
  4. 【实例记录】在ubuntu上运行python实现与单片机多线程串口通信
  5. 【Linux网络编程】组播
  6. redis windows下的环境搭建
  7. 单线程写多线程读安全的结构体
  8. JS之返回数组指定元素的slice
  9. deepin8、9安装docker并添加用户,解决报错:aptsources.distro.NoDistroTemplateException
  10. 2699元不加价!魅族16s Pro国家宝藏之越王勾践剑礼盒上架
  11. torch.nn模块介绍
  12. 数据规划(python实现数独自动算法之三)
  13. Premiere Pro之视频转场效果(四)
  14. 跨省市跳槽,社保公积金处理办法
  15. oracle 索引 状态 unusable,usable ,disable,enable
  16. 从狂热的苹果粉丝们来看中国式“杯具”
  17. 漫画:鉴权与安全访问控制的技术血脉
  18. 【NAS备份】摆脱丢数据的噩梦,群晖备份硬核实战教程分享
  19. 红米4a android p,一图彻底看懂红米4/红米4A
  20. (修订)准备互联网校招,你需要知道的一些事

热门文章

  1. 和aes相比较有哪些特点_“黑枸杞”和“红枸杞”相比较,功效方面究竟存在哪些差别?...
  2. 微信红包问题:找出某个出现次数超过红包总数一半的红包的金额(面试题)
  3. 驱动框架2——内核驱动框架中LED的基本情况、初步分析
  4. 数据结构——树的理解路线(总)
  5. CodeForces - 627A
  6. Dojo API中文 Dojo内容模块概览,初学者
  7. 【习题 5-8 UVA - 230】Borrowers
  8. PHP配置环境中开启GD库
  9. final个人阅读作业
  10. modelsim 的高效使用