第九章 动态规划part09
● 198.打家劫舍
class Solution {
public int rob(int[] nums) {
// 检查数组是否为空
if(nums == null || nums.length == 0){
return 0;
}
// 检查数组只有一个元素的情况
if (nums.length == 1){
return nums[0];
}
// 获取数组的长度
int length = nums.length;
// 初始化一个 dp 数组来存储每个房屋的最大收益
int[] dp = new int[length];
// 第一个房屋的最大收益是它自己的值
dp[0] = nums[0];
// 第二个房屋的最大收益是第一个房屋和第二个房屋值中的最大值
dp[1] = Math.max(nums[0],nums[1]);
// 从第三个房屋开始 计算每个房屋的最大收益
for(int i = 2; i < length; i++){
// 对于每个房屋 可以选择偷它
// 意味着不能偷窃上一个房屋 所以最大收益是
// 上上一个房屋的最大收益 加上当前房屋的值
// 或者选择不偷 意味着保留上一个房屋的最大收益
// 选择两者之间的最大值作为当前房屋的最大收益
dp[i] = Math.max(dp[i - 2] + nums[i],dp[i -1]);
}
// 最后 返回到最后一个房屋时能偷窃盗的最高金额
return dp[length -1];
}
}
● 213.打家劫舍II
● 337.打家劫舍III