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