按照方法分类
(三)动态规划问题(cn.)
20、 打家劫舍(一):不能偷相邻的两家,给定一个整数数组nums,数组中的元素表示每个房间存有的现金数额,请你计算在不被发现的前提下最多的偷窃金额。
- 动态规划:
- dp[i]表示最多能偷取到多少钱;
- 状态转移方程为
dp[i]=max(dp[i−1],nums[i−1]+dp[i−2])
:- 每次对于一个人家,我们选择偷他或者不偷他,如果我们选择偷那么前一家必定不能偷,因此累加的上上级的最多收益,
- 同理如果选择不偷他,那我们最多可以累加上一级的收益
- 注意
- dp是一个长度为len+1的数组,dp[i]表示对于长度为i的数组nums,最多能偷取到多少钱
21、 打家劫舍(二):沿湖的房间组成一个闭合的圆形,即第一个房间和最后一个房间视为相邻。
(1)分析
- 在原先的方案中第一家和最后一家不能同时取到。
- 原先的方案是:用dp[i]表示长度为i的数组,最多能偷取到多少钱,只要每次转移状态逐渐累加就可以得到整个数组能偷取的钱。
- 此时第一家与最后一家不能同时取到,那么我们可以分成两种情况讨论,最后取两种情况的较大值即可
(2)思路
- 情况1:偷第一家的钱,不偷最后一家的钱。初始状态与状态转移不变,只是遍历的时候数组最后一位不去遍历。
- 情况2:偷最后一家的,不偷第一家的钱。初始状态就设定了dp[1]=0,第一家就不要了,然后遍历的时候也会遍历到数组最后一位。