logo头像
Snippet 博客主题

算法学习:动态规划1-打家劫舍

递推关系

  设置dp[i]为当前打劫到第i个户的最大收益,那么,当前收益等于前一个户的最大收益前两个户的最大收益加上当前户的收益的最大值:

边界条件

  1. 数组长度为0的情况
  2. 数组长度为1的情况
  3. dp[0]为第一户的收益,dp[1]为前两个户收益的最大值

代码

class Solution {
    public 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(dp[0],nums[1]);
        for(int i = 2;i<len;i++){
            //当前的dp = max(前一个dp值,前两个dp值+当前值)
            dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]);
        }
        return dp[len-1];
    }
}