public class HouseRobber {
//方法一:动态规划
public int rob1(int[] nums) {
int n = nums.length;
//特殊情况
if(nums==null||n==0){
return 0;
}
//定义状态,将前i个房屋能偷到的最大金额保存到dp[i]中
int[] dp = new int[n+1];
//定义初始状态
dp[0] = 0;
dp[1] = nums[0];
//遍历状态,依次转移
for (int i = 2; i <=n; i++) {
dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i-1]);
}
return dp[n];
}
//方法二:空间优化
public int rob(int[] nums) {
int n = nums.length;
//特殊情况
if(nums==null||n==0){
return 0;
}
//定义初始状态
int pre2 = 0;
int pre1 = nums[0];
//遍历状态,依次转移
for (int i = 1; i <n; i++) {
int curr = Math.max(pre1,pre2+nums[i]);
pre2 = pre1;
pre1 = curr;
}
return pre1;
}
public static void main(String[] args) {
int[] nums = {2,7,9,3,1};
HouseRobber houseRobber = new HouseRobber();
System.out.println(houseRobber.rob(nums));
}
}