lc198.打家劫舍1
题目
思路
状态转移方程f[i]的含义:表示抢劫到第i家(从0开始)时,能够获得的最高金额
考虑集合的两个组成部分:
1.第i家进行打劫,意味着第i-1家不能进行打劫,否则会触发警报,则f[i] = f[i-2] + nums[i];
2.第i家不进行打劫,则最大金额为f[i] = f[i-1];
代码
class Solution {
public int rob(int[] nums) {
int n = nums.length;
if(n == 1) return nums[0];
int[] f = new int[n];
f[0] = nums[0];
f[1] = Math.max(nums[0], nums[1]);
for(int i = 2; i < n; i++) {
f[i] = Math.max(f[i-2] + nums[i], f[i-1]);
}
return f[n-1];
}
}
lc213.打家劫舍II
题目
思路
相比上一题多了两种情况,在上一题的基础上,我们对打劫范围进行划分:
1.打劫第0家,不打劫最后一家
2.不打劫第0家,打劫最后一家
进行两次dp,取结果的最大值即可
代码
class Solution {
public int rob(int[] nums) {
int n = nums.length;
if(n == 1) return nums[0];
int[] f = new int[n];
f[0] = nums[0];
f[1] = Math.max(nums[0], nums[1]);
for(int i = 2; i < n - 1; i++) {
f[i] = Math.max(f[i-2] + nums[i], f[i-1]);
}
int res = f[n-2];
f[0] = 0;
f[1] = nums[1];
for(int i = 2; i < n; i++) {
f[i] = Math.max(f[i-2] + nums[i], f[i-1]);
}
res = Math.max(res, f[n-1]);
return res;
}
}