打家劫舍-动态规划

43 阅读1分钟
// 打家劫舍-动态规划  
// 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。  
// 输入:[1,2,3,1]  
// 输出:4  
// 解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。  
// 偷窃到的最高金额 = 1 + 3 = 4 。  
public static int rob(int[] nums){  
    if(nums==null||nums.length==0){  
        return 0;  
    }  
    int len=nums.length;  
    if(len==1){  
        return nums[0];  
    }  
    int[] dp=new int[len];  
    // 第一个元素的状态取第一个  
    dp[0]=nums[0];  
    // 第二个元素的状态就取前一个和当前的最大  
    dp[1]=Math.max(nums[0],nums[1]);  
    // 由基础状态递推最终状态  
    for (int i = 2; i <len ; i++) {  
        // 取前一个就取不相连的加当前dp[i-2]+nums[i]  
        // 不取当前就取前一个dp[i-1]  
        dp[i]=Math.max(dp[i-2]+nums[i],dp[i-1]);  
    }  
}  
  
  
public static int robTwo(int[] nums){  
    if(nums==null||nums.length==0){  
        return 0;  
    }  
    int len=nums.length;  
    if(len==1){  
        return nums[0];  
    }  
    //优化数据结构,用两个变量存储状态进行状态转移  
    int first=nums[0],second=Math.max(nums[0],nums[1]);  
    for (int i = 2; i < len; i++) {  
        int temp=second;  
        second=Math.max(first+nums[i],second);  
        first=temp;  
    }  
    return second;  
}