题目描述:https://leetcode.com/problems/house-robber/
https://www.lintcode.com/problem/house-robber/description
第i间房屋能打劫得到的最大金额有两种可能,1.不打劫,金额和i-1间房屋相同;2.打劫这一间,最大金额是这一间的钱和打劫到第i-2间能得到的最多的钱相加;动态方程是:dp[i]=max(dp[i-1],A[i]+dp[i-2])
lintcode上题目要求空间复杂度为常数且答案是long型,只需要用两个参数记录前一间、前两间最多能打劫到的钱数即可。
如果不是long型限制,可以直接在原数组上计算。
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size()==0) return 0;
if (nums.size()==1) return nums[0];
nums[1]=max(nums[1],nums[0]);
for (int i=2;i<nums.size();i++)
nums[i]=max(nums[i-1],nums[i]+nums[i-2]);
return nums[nums.size()-1];
}
};