【線性DP】打家劫舍
阿新 • • 發佈:2021-10-14
【題目連結】
【題目描述】
你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數陣列,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。
【輸入輸出樣例】
1 2 3 1
4
【資料範圍】
1 <= nums.length <= 100
0 <= nums[i] <= 400
狀態表示:f[i] 表示偷竊到第i家的最大金額
狀態轉移:
假設小偷當前偷盜第i家:
如果決定偷f[i]的話,由於不能偷竊相鄰的兩家,那麼當前狀態就必不可能從f[i - 1]轉移得到,因此f[i] = f[i - 2] + monety[i]
如果決定不偷f[i],那麼f[i]就從f[i - 1]轉移得到,即f[i] = f[i - 1]
之後取兩種決策的最大值即可,f[i] = max(f[i - 2] + monety[i],f[i - 1]);
1 const int N = 109; 2 int f[N]; 3 class Solution { 4 public: 5 int rob(vector<int>& nums) { 6 if(nums.size() == 1) 7 return nums[0]; 8 f[0] = nums[0]; 9 f[1] = max(nums[0],nums[1]); 10 for(int i = 2;i < nums.size();++i) 11 f[i] = max(f[i - 1],f[i - 2] + nums[i]); 12 return f[nums.size() - 1]; 13 } 14 };