DP-两个并列DP-HouseRobber系列

这篇是“两个并列DP”的第一篇,先写典型的HouseRobber系列。特点是:需要分情况讨论当前的选择、做法是:维护两个DP,维护的时候两者互相影响。偷当前元素,robCur不偷当前元素,notRobCur198. House RobberInput: [1,2,3,1] 不能偷相邻的,求最大和。Output: 4Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).Total amount you
摘要由CSDN通过智能技术生成

这篇是“两个并列DP”的第一篇,先写典型的HouseRobber系列。相邻的房子不能都偷(即不能2-in-a-row)。
后面再加一个paint fence,是不能有超过两个连续的(即不能3-in-a-row)。

特点是:需要分情况讨论当前的选择、
做法是:维护两个DP,维护的时候两者互相影响。

  1. 偷当前元素,robCur
  2. 不偷当前元素,notRobCur
题目 简介
198. House Robber
213. House Robber II
337. House Robber III
276. Paint Fence

198. House Robber

Input: [1,2,3,1] 不能偷相邻的,求最大和。Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.

分情况讨论:

  1. 我们决定偷当前元素:则要确定robCur[i]。
    不能偷前一个,即可以继承notRobCur[i-1]的累积收入
    当前元素可以加入累积收入,nums[i]
  2. 我们决定不偷当前元素,则要确定notRobCur[i]。
    不偷当前的,于是前一个可以偷也可以不偷,但注意!!并不能将robCur[i-1]和notRobCur[i-1]加起来,因为这两者是互斥的,两个状态不能同时都要。
    比如,robCur[i-1]定义为“如果我们决定偷i-1元素的前提下,能累积收入的最大值“,和notRobCur[i-1]是条件上互斥的)
    于是,是取两种选择的max
class Solution {
   
    public int rob(int[] nums) {
   
        if (nums.length == 0) {
   return 0;}
        int len = nums.length;
        int[] robCur = new int[len];
        int[] notRobCur = new int[len];
        robCur[0] = nums[0];
        notRobCur[0] = 0;
        for (int i = 1; i < len; i++) {
   
            robCur[i] = notRobCur[i-1] + nums
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值