打劫房屋

題目:

假設你是一個專業的竊賊,準備沿着一條街打劫房屋。每一個房子都存放着特定金額的錢。你面臨的惟一約束條件是:相鄰的房子裝着相互聯繫的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警
給定一個非負整數列表,表示每一個房子中存放的錢, 算一算,若是今晚去打劫,在不觸動報警裝置的狀況下,你最多能夠獲得多少錢。測試

樣例:

給定 [3, 8, 4], 返回 8.code

思路:

若是選擇了搶劫上一個屋子,那麼就不能搶劫當前的屋子,因此最大收益就是到上一個屋子爲止的最大收益;
若是選擇搶劫當前屋子,就不能搶劫上一個屋子,因此最大收益是到上上一個屋子爲止的最大收益,加上當前屋子裏有的錢。it

參考答案:

class Solution {
public:
    /*
     * @param A: An array of non-negative integers
     * @return: The maximum amount of money you can rob tonight
     */
    long long houseRobber(vector<int> &A) {
        // write your code here
        int n = A.size();
       if(n==0)  return 0;
       if(n==1) return A[0];
       /*前一次最大收益*/
       long int last_max = A[0];
       /*當前最大收益,指的是沒有打劫第i間屋子的最大收益*/
       long int current_max = max(A[0],A[1]);
       
       /*遇到下一個房間,判斷如何選擇*/       
       for(int i=2; i<n; i++)
       {
           long int temp = current_max;
           //決定要不要打劫第i間屋子
           current_max= max(current_max, last_max+A[i]);
           last_max = temp;
           //cout<<n<<" "<<current_max<<endl;
           /*逗,有個測試用例的數據特別大,int類型裝不下,因此不經過。*/
        }
        return current_max;
    }
};
相關文章
相關標籤/搜索