算法提高之LeetCode刷题数据结构和算法分析第四单元的LeetCode题解

LeetCode 198. 打家劫舍

2018-04-03  本文已影响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];
   }
}
上一篇下一篇

猜你喜欢

热点阅读