1. 程式人生 > 其它 >【線性DP】打家劫舍II

【線性DP】打家劫舍II

【題目連結】

打家劫舍II

【題目描述】

你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都 圍成一圈 ,這意味著第一個房屋和最後一個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警 。

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

【輸入輸出樣例】

2 3 2

3
【資料範圍】

1 <= nums.length <= 100
0 <= nums[i] <= 400

不同與打家劫舍,由於存在環,因此頭尾的資料需要特殊處理,當偷竊了第1個房屋,則第n個房屋就一定不能被選擇;當第n個房屋被選擇,則第1個房屋也一定不能被選擇。

那麼可以通過直接放棄偷竊第1個房屋或者第n個房屋來計算所能偷竊到的最高金額,之後取兩種決策中的最大值即可。

 1 #include <algorithm>
 2 const int N = 109;
 3 int f[N];
 4 class Solution {
 5 public:
 6     int rob(vector<int>& nums) {
 7         if(nums.size() == 1)
 8             return nums[0];
 9         if(nums.size() == 2)
10             return
max(nums[0],nums[1]); 11 return max(dp(nums,0,nums.size()-2),dp(nums,1,nums.size() - 1)); 12 } 13 int dp(vector<int>& nums,int i,int j) 14 { 15 f[i] = nums[i]; 16 f[i + 1] = max(nums[i],nums[i+1]); 17 for(int k = i + 2;k <= j;++k) 18 f[k] = max(f[k - 1
],f[k - 2] + nums[k]); 19 return f[j]; 20 } 21 };