题目链接
思路:
动态规划思路。每遇到一户人家,有两种选择,第一种,偷他家的,第二种,不偷他家的。两种选择中选最大。
使用一个数组dp来记录,当前到达每户人家时,所能偷的最大数。
则 dp[0] = nums[0], 遇到第一户人家,偷
dp[1] = Math.max(nums[0], nums[1]) 遇到第二户人家,由于不能偷相邻人家的,故在这两户人家中选择金额最大的去偷
dp[ i ] = Math.max(dp[ i - 2 ] + nums[ i ], dp[ i - 1 ]); 之后遇到的每户人家,
选择偷时,当前金额为位于 i - 2 户人家的金额加 当前人家的金额
选择不偷时,当前金额为之前一户人家的金额
两者选择最大的即可。
public int rob(int[] nums) {
if (nums == null || nums.length == 0) {
return 0;
}
if (nums.length == 1) {
return nums[0];
}
int[] dp = new int[nums.length];
dp[0] = nums[0];
dp[1] = Math.max(nums[1], nums[0]);
for (int i = 2; i < nums.length; i++) {
dp[i] = Math.max(dp[i - 1], nums[i] + dp[i - 2]);
}
return dp[nums.length - 1];
}