【線性DP】打家劫舍II
阿新 • • 發佈:2021-10-14
【題目連結】
【題目描述】
你是一個專業的小偷,計劃偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都 圍成一圈 ,這意味著第一個房屋和最後一個房屋是緊挨著的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警 。
給定一個代表每個房屋存放金額的非負整數陣列,計算你 在不觸動警報裝置的情況下 ,今晚能夠偷竊到的最高金額。
【輸入輸出樣例】
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 returnmax(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 };