leetcode——動態規劃

198 打家劫舍

一個小偷計劃偷竊沿街的房屋。每間房內都藏有一定的現金,但相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。

給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下能夠偷竊到的最高金額。

示例 1:

輸入: [1,2,3,1]
輸出: 4
解釋: 偷竊 1 號房屋 (金額 = 1) ,然後偷竊 3 號房屋 (金額 = 3)。偷竊到的最高金額 = 1 + 3 = 4 。

--------------------------------------------------------------------------------------------------

思路:定義一個數組dp表示前i個房子中能搶到的最大現金:、

  • 當i = 1時,dp[0] = nums[0];當i = 2時,dp[1] = max(nums[0], nums[1])。
  • 對於i > 2,從兩個選擇中選最大的:搶第i個房子,並加上dp[i - 2];不搶第i個房子,保持現有最大現金。
    public int rob(int[] nums) {
      int length = nums.length;
      if(length <= 1) return (length == 0) ? 0 : nums[0];
      int[] dp = new int[length];
      dp[0] = nums[0];
      dp[1] = Math.max(nums[0], nums[1]);
      for(int i = 2; i < length; i++) {
        dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
      }
      return dp[length - 1];
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章