LeetCode 198. 打家劫舍

作者: 第四单元 | 来源:发表于2018-04-03 21:39 被阅读17次

    题目

    你是一个专业的强盗,计划抢劫沿街的房屋。每间房都藏有一定的现金,阻止你抢劫他们的唯一的制约因素就是相邻的房屋有保安系统连接,如果两间相邻的房屋在同一晚上被闯入,它会自动联系警方。

    给定一个代表每个房屋的金额的非负整数列表,确定你可以在没有提醒警方的情况下抢劫的最高金额。

    思路

    这一题标注的动态规划。我们来用动态规划的思想来做。动态规划的关键是:1定义问题;2找出递归式;3:初始化。
    这个题的问题定义:dp[i] 抢劫o-i的房子获得的最大利润。
    dp[0]=nums[0]; 如果只打劫第一家,那只能获利nums[0]
    dp[1]=Math.max(nums[0],nums[1]); 如果可以打劫前两家,那么可以选择一家钱的打劫。

    dp[i]=Max(dp[i - 2] + nums[2], dp[i - 1]); 如果打劫前i家,那么可以选择打劫前i-2家和第i家,或者不打劫第i家(dp[i-1])

    代码(带测试)

    import java.util.Scanner;
    
    public class Solution {
       public static void main(String[] args) {
           Solution solution = new Solution();
           Scanner scanner = new Scanner(System.in);
    
           int n = scanner.nextInt();
           int[] arr = new int[n];
           for(int i = 0; i < n; i++)
               arr[i] = scanner.nextInt();
    
           System.out.println(solution.rob(arr));
       }
       public int rob(int[] nums) {
           if(nums == null || nums.length == 0) return 0;
           if(nums.length == 1) return nums[0];
           if(nums.length == 2) return Math.max(nums[0],nums[1]);
    
           int length = nums.length;
    
           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-1],dp[i-2]+nums[i]);
           }
           return dp[length - 1];
       }
    }
    

    相关文章

      网友评论

        本文标题:LeetCode 198. 打家劫舍

        本文链接:https://www.haomeiwen.com/subject/mnzchftx.html