1. 程式人生 > >LintCode 534. 打劫房屋 II

LintCode 534. 打劫房屋 II

得出 turn solution 自動 imu 同時 互聯 由於 得到

在上次打劫完一條街道之後,竊賊又發現了一個新的可以打劫的地方,但這次所有的房子圍成了一個圈,這就意味著第一間房子和最後一間房子是挨著的。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是:相鄰的房子裝著相互聯系的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動報警。

給定一個非負整數列表,表示每個房子中存放的錢, 算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動報警裝置的情況下。

註意事項
這題是House Robber的擴展,只不過是由直線變成了圈

樣例
給出nums = [3,6,4], 返回 6, 你不能打劫3和4所在的房間,因為它們圍成一個圈,是相鄰的.

思路:動態規劃,從第I題可以得出遞推關系式為A[i] = max(A[i-1],A[i-2]+A[i]);這裏由於這題變成了一個圈,所以頭尾兩個數不能同時取到,所以把這個圈分成[0,n-1]和[1,n]兩部分分別計算所能得到的最大值然後取較大值就可以了。

 1 class Solution {
 2 public:
 3     /**
 4      * @param nums: An array of non-negative integers.
 5      * @return: The maximum amount of money you can rob tonight
 6      */
 7     int houseRobber2(vector<int> &nums) {
 8         // write your code here
 9         int size = nums.size();
10 if(size == 0) return 0; 11 if(size == 1) return nums[0]; 12 13 vector<int> L(size,0);//兩個數組做動態規劃 14 vector<int> R(size,0); 15 L[1] = nums[0];//初始化 16 R[1] = nums[1]; 17 for(int i=2;i<size;++i){//遞推公式,註意nums中數的順序先後 18 L[i] = max(L[i-2
]+nums[i-1],L[i-1]); 19 R[i] = max(R[i-2]+nums[i], R[i-1]); 20 } 21 return max(L[size-1],R[size-1]);//取較大值 22 } 23 };

LintCode 534. 打劫房屋 II