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)); } }