程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> [LeetCode從零單刷]House Robber

[LeetCode從零單刷]House Robber

編輯:C++入門知識

[LeetCode從零單刷]House Robber


題目:

 

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected andit will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonightwithout alerting the police.

解答:

不能夠連續搶劫兩家房屋。看到這種有限制地選擇數組中的一部分,求和。很自然就想到動態規劃。

等到當前房屋,分為兩個狀態:搶劫當前房屋 (selected)、不搶劫當前房屋 (unselected)。兩種狀態兩種最優值。

selected: 上個房屋 unselected 最優值 + 當前房屋財產(財產必然為非負數)unselected: max(上個房屋 unselected 最優值,上個房屋 selected 最優值)(不搶劫當前房屋,無論上個房屋是否被搶劫都成立)

 

class Solution {
public:
    int rob(vector& nums) {
        int size = nums.size();
        if (size < 1) return 0;
        
        vector selected;
        vector unselected;
        selected.push_back(nums[0]);
        unselected.push_back(0);
        
        for(int i = 1; i< size; i++) {
            selected.push_back(unselected[i-1] + nums[i]);
            unselected.push_back(selected[i-1] > unselected[i-1] ? selected[i-1] : unselected[i-1]);
        }
        
        return selected[size-1] > unselected[size-1] ? selected[size-1] : unselected[size-1];
    }
};

 

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved