题目链接

打家劫舍

题目描述

image.png

实现代码

思路:其实爬楼梯类似,不过每次必须爬>1的楼梯;
记dp[i]表示有i家住户的情况能偷窃到的最大金额,可以知道结果只与前两个位置有关,相邻的位置不取第i个住户,中间隔了两个位置的偷窃第i个住户,则有状态转移方程:

dp[i] = min(dp[i-1], dp[i-2] + nums[i]);

实现代码如下:

  1. class Solution {
  2. public int rob(int[] nums) {
  3. int n = nums.length;
  4. if(n == 1) {
  5. return nums[0];
  6. }
  7. int[] dp = new int[n];
  8. dp[0] = nums[0];
  9. dp[1] = Math.max(nums[0], nums[1]);
  10. for(int i=2; i<n; i++) {
  11. dp[i] = Math.max(dp[i-1], dp[i-2] + nums[i]);
  12. }
  13. return dp[n-1];
  14. }
  15. }