【Leetcode】198. House Robber

162 阅读1分钟

题目地址: leetcode.com/problems/ho…

有一个数组A AA代表每个房子的财富值。有个小偷想偷尽可能多的财富,但他不能同时偷相邻的两个房子。问他最多能偷多少钱。

动态规划。设f[i]代表到第 i个房子为止,他能偷的最大财富。设每个房子的财富值为 h[i]。如果已知到第i−1个房子为止,他能偷的最大财富值,那么到第 i个房子为止,能偷的最大财富值有两种情况: 1、他偷第 i个房子,那么最大是

f[i-2]+h[i];

2、他不偷第 i个房子,那么最大是

f[i−1]。 取两者较大的即可。代码如下

public class Solution {
    public int rob(int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        
        // dp代表第i栋房子为止,小偷能偷到的最大财富值(i从1开始计算)
        int[] dp = new int[nums.length + 1];
        dp[1] = nums[0];
        
        for (int i = 1; i < nums.length; i++) {
            dp[i + 1] = Math.max(nums[i] + dp[i - 1], dp[i]);
        }
        
        return dp[nums.length];
    }
}