LeetCode 198, 213 House Robber

198 House Robber

DP

0~n-1     ans=dp[n-1]

dp[i] = max(dp[i-2]+nums[i], dp[i-1])  i>=2

如果要输出偷了那些房子,可以用backpointer来记录 argmax dp[i],即记录dp[i] 是通过 i-1 还是 i-2 得到最大值的。

所有dp问题都可以用backpointer来找.

class Solution {
public:
    int rob(vector<int>& nums) {
        int n=nums.size();
        if (n==0) return 0;
        if (n==1) return nums[0];
        if (n==2) return max(nums[0],nums[1]);
        
        vector<int> dp(n);
        vector<int> bp(n); //record the the previous index : argmax dp[i]
        dp[0] = nums[0]; bp[0]=-1;
        dp[1] = max(nums[0],nums[1]); bp[1]=-1;
        for (int i=2;i<n;++i){
            // dp[i] = max(dp[i-2]+nums[i], dp[i-1]);
            if (dp[i-2]+nums[i]>=dp[i-1]){
                dp[i] = dp[i-2]+nums[i];
                bp[i] = i-2;
            }else{
                dp[i] = dp[i-1];
                bp[i] = i-1;
            }
        }
        vector<int> res;
        int pos=bp[n-1]==n-2?n-2:n-1;
        while (pos!=-1){
            res.push_back(nums[pos]);
            pos = bp[pos];
        }
        reverse(res.begin(),res.end());
        for (auto x:res) cout<<x<<' ';
        return dp[n-1];
    }
};

 

  

213 House Robber II

Since we cannot rob nums[0] and nums[n-1] at the same time, we can divide this problem into two cases:

not rob nums[0]

not rob nums[n-1]

and the answer is the maximum one.

C++ stl vector可以用 vector<int> nums1(nums.begin(), nums.end())来初始化 比较实用

posted @ 2018-04-18 13:41  約束の空  阅读(106)  评论(0)    收藏  举报