一,問題描述
二,問題分析
每一間房屋你都有偷或者不偷兩種選擇,且不可偷相鄰的房屋,從最後一項開始分析,到最後一間房子n能夠的最大金額有兩個來源,一是不偷最後一間房屋,得到前n-1項房屋的最大值,二是偷最後一間房屋那麼就不偷第n-1的房屋,那麼最大金額就是前 n-2間房屋的最大值加上偷最後一間房屋的金額。兩種情況取最大值即可,很明顯滿足最優子結構。
1.定義狀態 dp[i] :表示0-i所房屋能夠偷取的最大值
2.初始狀態:dp[0] = nums[0];
dp[1] = max(nums[0],nums[1]);
2.狀態轉移:dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
三,問題解答
class Solution {
public:
int rob(vector<int>& nums) {
//dp[i] : 表示前 i 個房屋能夠獲得的最大值
int len = nums.size();
if(len == 0){ //輸入情況是空即 nums = [];
return 0;
}
if(len == 1){ //輸入情況只有一個房屋即 nums = [ i ];
return nums[0];
}
vector<int> dp(len);
dp[0] = nums[0]; //初始狀態
dp[1] = max(nums[0],nums[1]);
for(int i=2;i<len;i++){ //狀態轉移
dp[i] = max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[len-1]; //返回最大值
}
};