寫在前面:
對於dp的關係式的推導有兩個殺手鐗:
1,確定自變量x,函數f(x)的實際意義
2,邊界情況來推導。
題目描述:
你是一個專業的小偷,計劃偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的
房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
輸入: [2,7,9,3,1]
輸出: 12
解釋: 偷竊 1 號房屋 (金額 = 2), 偷竊 3 號房屋 (金額 = 9),接着偷竊 5 號房屋 (金額 = 1)。
偷竊到的最高金額 = 2 + 9 + 1 = 12
簡單的一個dp 耗時:100%! 內存:5.18%
//確定函數:x爲當前準備偷的家的編號, f(x)代表偷到這家時最多可以獲取的錢。
f[i] = max(f[i - 2] + nums[i], f[i - 1]);
//表格優化:返回末尾值即可, 再度優化:使用兩個變量保存前兩個值就好了,可以不使用數組
class Solution {
public:
int rob(vector<int>& nums) {
int len = nums.size();
if (len == 0) return 0;
if (len > 1) {
vector<int> f(len);
f[0] = nums[0];
f[1] = max(nums[0], nums[1]);
for (int i = 2; i < len; i++) {
f[i] = max(f[i - 2] + nums[i], f[i - 1]);
}
return f[len - 1];
}
return nums[0];
}
};