题目地址: 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];
}
}