1. 程式人生 > >198. House Robber的C++解法(dp)

198. House Robber的C++解法(dp)

題目描述: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];
    }
};