这篇是“两个并列DP”的第一篇,先写典型的HouseRobber系列。相邻的房子不能都偷(即不能2-in-a-row)。
后面再加一个paint fence,是不能有超过两个连续的(即不能3-in-a-row)。
特点是:需要分情况讨论当前的选择、
做法是:维护两个DP,维护的时候两者互相影响。
- 偷当前元素,robCur
- 不偷当前元素,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.
分情况讨论:
- 我们决定偷当前元素:则要确定robCur[i]。
不能偷前一个,即可以继承notRobCur[i-1]的累积收入
当前元素可以加入累积收入,nums[i] - 我们决定不偷当前元素,则要确定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