0
点赞
收藏
分享

微信扫一扫

算法题总结(十)

毅会 2022-05-06 阅读 52

按照方法分类

(三)动态规划问题(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,第一家就不要了,然后遍历的时候也会遍历到数组最后一位。
举报

相关推荐

0 条评论