leetcode題解 - 動態規劃(3)

寫在前面:

對於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];

	}
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章